В попытке выяснить, как компилятор С# оптимизирует код, я создал простое тестовое приложение. С каждым изменением теста я скомпилировал приложение, а затем открыл двоичный файл в 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_
! Есть ли веская причина, почему компилятор С# будет делать это?
Для полной проверки это вывод 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");
}
}
}
}
UPDATE
По-видимому, после проверки IL, это проблема с ILSpy, а не с компилятором С#. Евгений Подскаль дал хороший ответ на мои первоначальные комментарии и наблюдения. Тем не менее, мне интересно узнать, является ли это скорее ошибкой в ILSpy или если это преднамеренная функциональность.