Verwendet der '' ?? '' Operator Shortcircuit?

8

Verwendet der Operator ?? in C # bei der Auswertung Kurzzirkel?

%Vor%

Wenn myObject nicht null ist, wird das Ergebnis von ExpressionWithSideEffects() nicht verwendet, aber wird ExpressionWithSideEffects() vollständig übersprungen?

    
pauldoo 23.06.2010, 16:28
quelle

3 Antworten

7

Ja, tut es. Wie immer ist die C # -Sprachspezifikation die definitive Quelle 1 .

Aus der C # 3 Spezifikation, Abschnitt 7.12 (v3 statt 4, da die v4 Spezifikation in dynamische Details geht, die hier nicht wirklich relevant sind):

  

Der Typ des Ausdrucks a ?? b hängt davon ab, welche impliziten Konvertierungen zwischen den Typen der Operanden verfügbar sind. In der Reihenfolge der Präferenz, der Typ von a ?? b ist A0, A oder B, wobei A der Typ von a ist, B der Typ von b ist (vorausgesetzt, dass b einen Typ hat) und A0 der zugrundeliegende Typ von A ist, wenn A ein nullbarer Typ oder sonst A ist . Insbesondere wird a ?? b als verarbeitet   folgt:

     
  • Wenn A kein Nullable-Typ oder Referenztyp ist, wird ein Fehler bei der Kompilierung angezeigt   tritt auf.
  •   
  • Wenn A ein Nullable-Typ ist und eine implizite Konvertierung von b nach   A0, der Ergebnistyp ist A0. Beim   Laufzeit, a wird zuerst ausgewertet. Wenn ein   ist nicht null, a wird zum Eingeben ausgepackt   A0, und das wird das Ergebnis.   Ansonsten wird b ausgewertet und   konvertiert in Typ A0, und dies wird   das Ergebnis.
  •   
  • Andernfalls, wenn eine implizite Konvertierung von b nach A existiert, ist der Ergebnistyp   A. Zur Laufzeit wird a zuerst ausgewertet.   Wenn a nicht null ist, wird a zum   Ergebnis. Ansonsten wird b ausgewertet und   konvertiert zu Typ A, und dies wird   das Ergebnis.
  •   
  • Andernfalls, wenn b einen Typ B hat und eine implizite Konvertierung von A0 nach   B, der Ergebnistyp ist B. Zur Laufzeit   a wird zuerst ausgewertet. Wenn a nicht ist   null, a wird zum Eingeben von A0 ausgepackt   (außer A und A0 sind gleich)   und konvertiert zu Typ B, und dies   wird zum Ergebnis. Ansonsten ist b   ausgewertet und wird das Ergebnis.
  •   
  • Andernfalls sind a und b nicht kompatibel und es tritt ein Kompilierungsfehler auf.
  •   

Das zweite, dritte und vierte Geschoss sind die relevanten.

1 Es gibt eine philosophische Diskussion darüber, ob der Compiler, den Sie gerade benutzen, die tatsächliche Quelle der Wahrheit ist ... ist die Wahrheit über eine Sprache was es ist gemeint zu tun oder was es gerade macht ?

    
Jon Skeet 23.06.2010, 16:42
quelle
10

Ja, es handelt sich um einen Kurzschluss.

Hier ist ein Snippet zum Testen in LinqPad:

%Vor%

Das erste Koaleszieren funktioniert, ohne eine Ausnahme auszulösen, während das zweite Koaleszieren (die Formatzeichenkette ist ungültig).

    
Will 23.06.2010 16:29
quelle
0

Deshalb haben wir Unit-Tests.

%Vor%

Das sind nicht die besten Testnamen, aber Sie bekommen die Idee. Es zeigt, dass der Nullkoaleszenzoperator wie erwartet kurzgeschlossen ist.

    
CaffGeek 23.06.2010 16:42
quelle

Tags und Links