Pozwala porównać dwa kawałki kodu:Czy inicjalizacja zmiennej lokalnej o wartości zerowej ma wpływ na wydajność?
String str = null;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
i
String str;
//Possibly do something...
str = "Test";
Console.WriteLine(str);
zawsze myślałem, że te fragmenty kodu są równe. Ale po tym, jak budować te mają kod (tryb wydania z optymalizacją sprawdzone) i porównano metody IL generowane zauważyłem, że istnieją jeszcze dwie instrukcje IL w pierwszej próbce:
1-te przykładowy kod IL:
.maxstack 1
.locals init ([0] łańucha)
IL_0000: ldnull
IL_0001: stloc.0
IL_0002: ldstr "test"
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009 call nieważne [mscorlib] System.Console :: WriteLine (ciąg)
IL_000e: ret
2-te Kod próbki IL:
.maxstack 1
.locals init ([0] string str)
IL_0000: ldstr "test"
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: zadzwoń void [mscorlib] System.Console :: WriteLine (string)
IL_000c: ret
Prawdopodobnie ten kod jest zoptymalizowany przez kompilator JIT? Podobnie inicjalizacja lokalnej zmiennej bethod o wartości zerowej wpływa na wydajność (rozumiem, że jest to bardzo prosta operacja, ale w każdym przypadku) i powinniśmy jej unikać? Dzięki wcześniej.
Powszechnie uważa się, że źle sformułowana jest inicjalizacja z wartością, która nigdy nie zostanie użyta, po prostu dlatego, że wprowadza zamieszanie (jest przypisana wartość "null", która nie ma znaczenia dla logiki). Wszelkie powiązane trafienie wydajnościowe jest pomijalne; poprzedni powód jest znacznie ważniejszym powodem, aby tego uniknąć. –
@Dan Bryany: Dzięki za komentarz. Zgadzam się z tobą, że nie powinniśmy używać wartości null do inicjalizacji, ale niektórzy programiści wolą używać go do bezpośredniej inicjalizacji. Mam taki w moim zespole :) –
Generalnie wolę nie zadeklarować zmiennej dopóki nie zostanie zainicjalizowany, ponieważ ogranicza to zakres pojęciowy przy próbie zrozumienia kodu (tj. Lokalnie są tak lokalne, jak to tylko możliwe, gdzie są,). Efektem ubocznym tego podejścia jest to, że gdy metoda rośnie, rozmieszczenie mieszkańców ma tendencję do zaznaczania obszarów kodu, gdzie można wyodrębnić nowe metody. –