Comparons deux morceaux de code :
String str = null;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
et
String str;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
J'ai toujours pensé que ces morceaux de code sont égaux. Mais après avoir construit ces codes (en mode Release avec optimisation vérifiée) et comparé les méthodes IL générées, j'ai remarqué qu'il y a deux instructions IL de plus dans le premier échantillon :
1er exemple de code IL :
.maxstack 1
.locals init ([0] string str)
IL_0000 : ldnull
IL_0001 : stloc.0
IL_0002 : ldstr "Test"
IL_0007 : stloc.0
IL_0008 : ldloc.0
IL_0009 : call void [mscorlib]System.Console::WriteLine(string)
IL_000e : ret
2ème exemple de code IL :
.maxstack 1
.locals init ([0] string str)
IL_0000 : ldstr "Test"
IL_0005 : stloc.0
IL_0006 : ldloc.0
IL_0007 : call void [mscorlib]System.Console::WriteLine(string)
IL_000c : ret
Il est possible que ce code soit optimisé par le compilateur JIT ? Est-ce que l'initialisation de la variable locale bethod avec null a un impact sur la performance (je comprends que c'est une opération très simple mais de toute façon) et nous devrions l'éviter ? Merci d'avance.