2010-10-13 11 views
9

Ich denke, ich erinnere mich an etwas ähnliches wie die ?: ternary operator in C#, die nur zwei Teile hatte und würde den Wert der Variablen zurückgeben, wenn es nicht null war und ein Standardwert, wenn es war. Etwas wie folgt aus:Koaleszenzoperator in C#?

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default"; 

Im Grunde entspricht dies:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default"; 

Gibt es eine solche Sache existieren oder habe ich nur vorstellen, das irgendwo sehen?

+1

Mögliches Duplikat -> http: // stackoverflow.com/questions/463155/how-do-the-ternary-Operator-Arbeit –

+3

@Junior, aber das ist über den ternären Operator, während es sich um den Koaleszenz-Operator (trotz des Titels) – Rup

+1

@Junior, während der Titel meiner Frage ist ein etwas irreführend, wenn Sie meine Frage lesen, werden Sie sehen, dass es nichts mit dem von Ihnen vorgeschlagenen Duplikat zu tun hat. –

Antwort

3

Lustig Sie verwendet "?? einigen Bedien HIER ??", wie der Bediener die Sie suchen sind, ist "??", das heißt:

tb_MyTextBox.Text = o.Member ?? "default"; 

http://msdn.microsoft.com/en-us/library/ms173224.aspx

+1

Heh, muss mein Unterbewusstsein ausgestreckt haben. Wusste, ich hätte es irgendwo gesehen. –

17

Nun, es bin nicht ganz dasselbe wie die conditional operator, aber ich denke, Sie denken an den null coalescing operator (??). (Ich denke, Sie sagten, es sei "ähnlich" :) Beachten Sie, dass "ternary" nur auf die Anzahl der Operanden des Operators bezieht - also, während der bedingte Operator ein ternärer Operator ist, ist der Koaleszenzoperator Null ein binärer Operator.

Es dauert im Großen und Ganzen diese Form:

result = first ?? second; 

Hier second wird nur ausgewertet werden, wenn first null ist. Es muss nicht das Ziel einer Zuweisung sein - Sie könnten es beispielsweise verwenden, um ein Methodenargument auszuwerten.

Beachten Sie, dass der erste Operand nullfähig sein kann - aber die zweite nicht. Obwohl es einige spezifische Details zu Konvertierungen gibt, ist der Typ des Gesamtausdrucks im einfachen Fall der Typ des zweiten Operanden. Durch die Assoziativität können Sie Anwendungen des Betreibers Stack ordentlich zu:

int? x = GetValueForX(); 
int? y = GetValueForY(); 
int z = GetValueForZ(); 

int result = x ?? y ?? z; 

Beachten Sie, wie x und y nullable, aber z und result nicht. Natürlich zkönnte nullable sein, aber dann result müsste auch Nullable sein.

Grundsätzlich werden die Operanden in der Reihenfolge ausgewertet, in der sie im Code erscheinen. Die Auswertung wird angehalten, wenn ein Wert ungleich Null gefunden wird.

Oh, und obwohl das oben in Bezug auf Werttypen gezeigt wird, funktioniert es auch mit Referenztypen (die sind immer Nullable).