Kopiert die Verwendung des Null-bedingten Operators Null-Checks? Zum Beispiel
%Vor%Wird das in folgendes übersetzt:
%Vor%Oder das?
%Vor%Wenn Ersteres, macht es einen Unterschied, ob es zwischen beiden Zeilen einen anderen Code gibt? Mit anderen Worten, wie intelligent ist der Compiler / Optimierer?
Der Compiler scheint davon ziemlich unwissend zu sein.
Der Code:
%Vor%... wird als nicht optimiert für:
kompiliert %Vor%... und optimiert als:
%Vor%Beide eindeutig mit zwei Zweigüberprüfungen.
Es werden zwei separate If..Else-Prüfungen für die Zuweisung durchgeführt, die in Ihrem Fall einen bedingten Operator von null verwenden. Unten ist ein disassemblierter Beispielcode
Quellcode:
%Vor%Zerlegter Code (ILSpy):
%Vor% Ich habe int
als Typ der Eigenschaft verwendet, aber das obige sollte für jeden anderen Fall gelten.
Der Compiler ist streng, denke über diesen Code nach.
%Vor% Das erwartete Ergebnis ist: x == 1, y is null
. Wenn der Compiler jedoch den Code mit einer if
-Anweisung optimiert, wird ein NullReferenceException
ausgegeben. Das bedeutet, dass die Verwendung einer if
-Anweisung keine intelligente Optimierung ist, es ist keine Optimierung, weil sie FALSCH ist.