2016-04-15 12 views
0

ich aus einem Artikel den folgenden Code habe, die ich nicht ganz den Unterschied in der sie in Bezug auf die Verwendung von Null-Operatoren verstehen:Null-Operator Verwirrung

if (memberAccessExpr?.Name.ToString() != "Match") return; 

Dies ist zu mir, dass ich klar raten Sie, überprüfen Sie die memberAccessExpr für null, und wenn es Null ist, gibt der Vergleich mit "Match" false zurück, ist das korrekt?

Die Verwirrung kommt mit dem zweiten:

if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return; 

Diese Codezeile erscheint mir ist so ziemlich das gleiche wie das erste, da ich eine einfache Prüfung null und dann eine Funktion aufrufen, die eine zurück Boolescher Wert (!= vs. StartsWith) ... Warum brauche ich einen zusätzlichen ?? - Operator hier und nicht in der ersten Zeile? Vielleicht hat es etwas mit dem impliziten == true Vergleich zu tun, der ohne den ?? - Operator stattfinden würde?

Ich habe keine Ahnung, vielleicht Jungs Sie mich aufklären können:)

Cheers, Michael

Antwort

2

Der Null-Ausbreitungs Operator gibt null, wenn der linke Teil null ist, oder der rechte Teil, wenn es nicht. Wenn das rechte Teil einen Werttyp zurückgibt, wird es in eine Nullable<T> konvertiert ... Wenn also der rechte Teil eine bool zurückgibt, gibt es eine ?., die eine Nullable<bool> (oder bool?) zurückgibt.

So zum ersten:

if (memberAccessExpr?.Name.ToString() != "Match") return; 

Mittel grob (ausführlich absichtlich):

string comparer; 

if(memberAccessExpr == null) 
    comparer = null; 
else 
    comparer = memberAccessExpr.Name.ToString(); 

if(comparer != "Match") return; 

Zum zweiten:

if (memberSymbol?.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match") ?? true) return; 

bedeutet in etwa:

bool? comparer; 

if (memberSymbol == null) 
    comparer = null; 
else 
    comparer = memberSymbol.ToString().StartsWith("System.Text.RegularExpressions.Regex.Match"); 

if(comparer ?? true) return; 

Wenn die letzte Zeile, die Sie verwirrt, die ?? Operator bedeutet in etwa: „Wenn der linke Teil null ist, kehren rechten Teil, sonst Rückkehr linken Teil“

+0

okay, jetzt habe ich es bekommen, da der Ausdruck in der zweiten Zeile ein Nullable-bool..confusing stuff..but Dank für die gute Antwort lautet:) –

+0

es wird ein Nullable-Bool da Sie verwenden Der Operator '? .' muss also in der Lage sein, sowohl einen 'Null'-Wert als auch das Ergebnis des Ausdrucks auf der rechten Seite zu halten (was ein' bool' ist), also 'bool?'.Beachten Sie, dass der Code nicht das ist, was der Compiler tut, es ist das, was ich Ihnen – Jcl

+0

so grundsätzlich erklärt habe, wenn ein Aufruf irgendetwas auf einem Objekt mit?. Operator, der einfache Typen zurückgibt, kann ich das Ergebnis mit einem überprüfen? Operator, da es die NULL Wert des Typs wird, oder? –

0

Sie haben einige Stenografie Betreiber über ? und ??

?. Operator MSDN Documentation

int? length = customers?.Length; // null if customers is null 
Customer first = customers?[0]; // null if customers is null 
int? count = customers?[0]?.Orders?.Count(); // null if customers, the first customer, or Orders is null 

?? Operator MSDN Documentation

// Assign i to return value of the method if the method's result 
// is NOT null; otherwise, if the result is null, set i to the 
// default value of int. 
int i = GetNullableInt() ?? default(int); 

?: Operator MSDN Documentation

// if-else construction. 
if (input > 0) 
    classify = "positive"; 
else 
    classify = "negative"; 

// ?: conditional operator. 
classify = (input > 0) ? "positive" : "negative";