2012-03-26 9 views
0

Ich arbeitete mit ?? Operator in C# 4 und fand eine interessante Funktion.Wie funktioniert der C# -Operator?

Diese Codezeile immer-existingObject null zuweist, wenn es ohnehin schon ist null unabhängig von der searchForObject() Rückgabewert (searchForObject ein nicht null-Objekt zurückgibt, in der Tat ist es eine LINQ-Anweisung nicht eine Funktion ist, und wenn die folgende Aussage wenn Konstrukt mit einfacher ersetzt wird, dann wird existingObject ein nicht null-Objekt zugewiesen werden):

existingObject = extstingObject ?? searchForObject(); 

Könnte jemand erklären, warum?

Hier a link auf MSDN ist, heißt es:

Ein Nullable Type einen Wert enthalten kann, oder es kann nicht definiert sein. Das ?? Der Operator definiert den Standardwert, der zurückgegeben werden soll, wenn einem Typ ohne NULL-Wert ein nullwertfähiger Typ zugewiesen ist. Wenn Sie versuchen, einen nullwertfähigen -Werttyp einem nicht nullbaren Werttyp zuzuweisen, ohne den Wert zu verwenden? Operator, Sie werden einen Kompilierungsfehler erzeugen. Wenn Sie einen Cast verwenden und der Nullwerttyp Nullwert derzeit nicht definiert ist, wird eine InvalidOperationException-Ausnahme ausgelöst.

Der Teil über das Zuweisen eines nullfähigen Typs zu einem nicht nullfähigen Typ ist nicht das, was ich erwartet habe.

Das Problem der Initialisierung von lokalen Variablen im Debugger von Visual Studio 2010.

+9

Anscheinend gibt 'searchForObject'-Methode null zurück. –

+3

Gibt es einen Tippfehler ?? – Jon

+0

Vielleicht, weil 'searchForObject()' immer Null zurückgibt/ – Aliostad

Antwort

1

Abgesehen von was ich in diesem Kommentar:

Es gibt auch eine Chance, die Sie nicht wirklich auf dem gleichen Code suchen , die Sie ausführen. Es passiert manchmal in Visual Studio. Rebuild das Projekt, versuchen Sie den Ordner bin löschen, setzen einige Debug.WriteLine s in verfolgen, was wirklich in der App vor sich geht (anstatt sich auf der IDE Watch) usw.

eine andere Frage in den Sinn kommt - ist existingObject wirklich Null nach der Zuweisung? :) Wie hast du das behauptet?

Werfen Sie einen Blick auf meine Frage (und die Antworten):

Surprising CLR/JIT? behaviour - deferred initialization of a local variable

3

vertagt Die ?? ist eine Abkürzung für

if (somethingisnull) 
    somethingisnull = somethingnotnull 

Deshalb searchForObject() muss null als auch

+0

Tatsächlich, wenn ich dieses Konstrukt verwende, bekomme ich einen Wert. – BanditoBunny

+0

Welcher Typ ist existingObject und welcher Typ wird searchForObject zurückgegeben? – Jon

+0

Derselbe Typ, eine benutzerdefinierte Klasse. – BanditoBunny

0

zurückkehren Der Grund ist woanders ist falsch. In dieser Codezeile wird der Rückgabewert searchForObject()existingObject zugewiesen, wenn existingObject Null ist.

2

?? gibt den linken Operanden zurück, wenn der Operand nicht null ist; andernfalls gibt es den rechten Operanden zurück.

// ?? operator example. 
    int? x = null; 
    // y = x, unless x is null, in which case y = -1. 
    int y = x ?? -1; 
+0

Ja, das ist ein Beispiel von MSDN, die auch das sagen ?? wird verwendet, um Typen, die keine NULL-Werte zuliefern dürfen, keine Nullwert-Typen zuzuweisen – BanditoBunny

+0

Wohin geht das? – Habib

+0

Sie können NULL nicht nullbaren Typen zuweisen – Habib

2

lesen: Coalescing operator - ??: Coalescing Betreiber neue Betreiber sind C# 2.0 hinzugefügt. Koaleszierender Operator wird auch als ?? bezeichnet.

Ohne ?? Betreiber

Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a==null ? b.Value : a; 

kann mit dem sein ersetzen ??wie wie unten

Nullable<int> a = null; 
Nullable<int> b = 10; 
int c = a ?? b.Value; 

?? ist oeprate zweite Wert zuzuweisen, wenn die erste

existingObject = extstingObject ?? searchForObject(); 

so in Ihrem Fall null erlaubt ist, wenn extstingObject ist null tha seine den Wert searchForObject() und zuweisen bekommen Objekt, wenn Sie Null als die zweite Funktion erhalten, geben Sie auch null zurück.

0

Hier gibt es etwas anderes passiert ist, searchForObject() muss null zurück. Sehen Sie sich das folgende Beispiel an.

object searchForObject() 
{ 
    return new object(); 
} 

Mit dieser Implementierung von searchForObject() wir dies tun können:

object existingObject = null; 
existingObject = existingObject ?? searchForObject(); 

Nun, wenn wir das einfach so testen:

Console.Write("existingObject is "); 
if (existingObject == null) Console.WriteLine("null"); 
else Console.WriteLine("not null"); 

Es wird uns sagen, dass existingObject is not null. Wenn wir jedoch ändern, was searchForObject() kehrt in diese:

object searchForObject() 
{ 
    return null; 
} 

Es wird uns sagen, dass existingObject is null. Nun ist ein letzter Test den Wert von existingObject zu ändern, bevor wir die erste Prüfung tun:

object existingObject = new object(); 
existingObject = existingObject ?? searchForObject(); 

Diese uns, dass existingObject is not null erzählen.

Wenn existingObject null ist, bedeutet dies, dass nach ?? null zurückgegeben wird.