ILSpy で C# コンパイラがどのようにコードを解釈したかを知る

C# はいろいろ省略してもいい感じに解釈されて動くので、
どのように解釈されているか知りたくなったのでメモ。

無償で提供されている逆コンパイラ、ILSply を使う。

参考:無償の逆コンパイラ「ILSpy」を利用するには?[C#] - @IT

インストールなしで利用できるので有難い。

さっそく簡単なコードで試してみた。

f:id:posnum:20141109202936j:plain

static void Main(string[] args)
{
    var foo = "";
    for (var i = 0; i < 100; i++)
    {
        foo = "bar";
        Console.WriteLine("{0}", i);
    }
}

わざと無駄なコードを入れてある。
これをビルドしておく。

ILSplyを起動し、Projectの\bin\debugにある.exeファイルを指定する。

f:id:posnum:20141109202943j:plain

private static void Main(string[] args)
{
    for (int i = 0; i < 100; i++)
    {
        Console.WriteLine("{0}", i);
    }
}

無駄な変数が削除されていることがわかる。
また、var i として宣言されていた変数がきちんとintとして解釈されている。
アクセス修飾子を省略すると、privateとして解釈されている。

しかし、実行ファイルを逆コンパイルするとここまで復元できるのは興味深い。

これは非常におもしろいツールを知った。 今後も使えそう。