CLR дает твердое обещание, что все локальные переменные будут инициализированы до значения по умолчанию при входе в метод перед выполнением первого оператора. Это обещание реализуется компилятором JIT. Понять это немного сложно, поскольку C # требует, чтобы переменные были явно инициализированы перед их использованием. Но вот пример:
static void Main(string[] args) {
int ix;
int.TryParse("42", out ix);
Console.WriteLine("", ix);
}
Используйте Debug + Windows + Disassembly, чтобы увидеть сгенерированный код:
// Stack frame setup elided...
00000006 xor eax,eax ; eax = 0
00000008 mov dword ptr [ebp-0Ch],eax ; ix = 0
// etc..
Перезапись этого кода для инициализации ix на ноль приводит к следующему коду:
00000006 xor eax,eax ; eax = 0
00000008 mov dword ptr [ebp-0Ch],eax ; ix = 0
0000000b xor edx,edx ; edx = 0
0000000d mov dword ptr [ebp-0Ch],edx ; ix = 0
Ну, это немного грустно. JIT-компилятор, как правило, неплохо умеет оптимизировать ненужный код, но в этом конкретном случае возится.
Итак, ты друг прав. По крайней мере, для JIT-компилятора x86, сейчас не близко к машине x64. Накладные расходы, вероятно, около половины наносекунды или около того. Не то, что легко измерить.