C# コンパイラがコードを最適化する方法を調べるために、簡単なテスト アプリケーションを作成しました。テストを変更するたびに、アプリケーションをコンパイルし、バイナリを ILSpy で開きました。
私にとって、奇妙なことに気づきました。これは明らかに意図的なものですが、コンパイラがこれを行う正当な理由が思いつきません。
次のコードを検討してください。
static void Main(string[] args)
{
int test_1 = 1;
int test_2 = 0;
int test_3 = 0;
if (test_1 == 1) Console.Write(1);
else if (test_2 == 1) Console.Write(1);
else if (test_3 == 1) Console.Write(2);
else Console.Write("x");
}
無意味なコードですが、ILSpy がステートメントをどのように解釈するかを確認するためにこれを書きましたif
。
しかし、このコードをコンパイル/逆コンパイルしたとき、頭を悩ませていることに気付きました。私の最初の変数は!test_1
に最適化されました。test_
C# コンパイラがこれを行う正当な理由はありますか?
完全な検査のために、これはMain()
ILSpy で見ている出力です。
private static void Main(string[] args)
{
int test_ = 1; //Where did the "1" go at the end of the variable name???
int test_2 = 0;
int test_3 = 0;
if (test_ == 1)
{
Console.Write(1);
}
else
{
if (test_2 == 1)
{
Console.Write(1);
}
else
{
if (test_3 == 1)
{
Console.Write(2);
}
else
{
Console.Write("x");
}
}
}
}
アップデート
IL を調べたところ、これは C# コンパイラではなく、ILSpy の問題であることがわかりました。Eugene Podskal は、私の最初のコメントと観察に対して適切な回答を提供してくれました。ただし、これが ILSpy 内のバグなのか、それとも意図的な機能なのかを知りたいと思っています。