Позволяет сравнить два фрагмента кода:Выполняет ли инициализация локальной переменной с нулевым воздействием?
String str = null;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
и
String str;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
Я всегда думал, что эти куски кода равны. Но после того как я построить этот код (режим Release с оптимизацией проверяемым) и по сравнению методов IL сгенерировано я заметил, что есть еще две команды IL в первом образце:
первого образец код IL:
.maxstack 1
.locals INIT ([0] строка Str)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldstr "Test"
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: вызов недействительным [mscorlib] System.Console :: WriteLine (строка)
IL_000e: RET
второй образец кода IL:
.maxstack 1
.locals инициализации ([0] строка ул)
IL_0000: ldstr "Тест"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: Зов пустота [mscorlib] System.Console :: WriteLine (строка)
IL_000c: RET
Возможно, этот код оптимизирован компилятором JIT? Итак, инициализация локальной переменной bethod с нулевым воздействием влияет на работу (я понимаю, что это очень простая операция, но в любом случае), и мы должны ее избегать? Спасибо заранее.
Обычно считается ошибочной формой для инициализации со значением, которое никогда не будет использоваться, просто потому, что оно добавляет путаницу (назначается «нуль», не имеющий смысла для логики). Любое связанное с этим поражение производительности незначительно; прежняя причина - гораздо более веская причина, чтобы избежать этого. –
@ Dan Bryany: Спасибо за комментарий. Я согласен с вами в том, что мы не должны использовать null для инициализации, но некоторые разработчики предпочитают использовать его для непосредственной инициализации. У меня есть такая в моей команде :) –
Обычно я предпочитаю не объявлять переменную до тех пор, пока она не будет инициализирована, поскольку это еще больше ограничивает концептуальную область при попытке понять код (т.е. местные жители максимально локальны там, где они находятся используется.) Побочным эффектом этого подхода является то, что по мере роста метода размещение местных жителей имеет тенденцию выделять области кода, в которых могут быть извлечены новые методы. –