Suche…


Syntax

  • var result = possibleNullObject ?? Standardwert;

Parameter

Parameter Einzelheiten
possibleNullObject Der Wert, der auf Nullwert getestet werden soll. Wenn nicht Null, wird dieser Wert zurückgegeben. Muss ein nullfähiger Typ sein.
defaultValue Der zurückgegebene Wert, wenn possibleNullObject ist NULL. Muss den gleichen Typ wie possibleNullObject .

Bemerkungen

Der nullkoaleszierende Operator selbst besteht aus zwei aufeinander folgenden Fragezeichenzeichen: ??

Es ist eine Abkürzung für den bedingten Ausdruck:

possibleNullObject != null ? possibleNullObject : defaultValue

Der linke Operand (Objekt, das getestet wird) muss ein Wertetyp oder einen Referenztyp sein, der einen Wert annehmen kann. Andernfalls tritt ein Kompilierungsfehler auf.

Das ?? Der Operator arbeitet sowohl für Referenztypen als auch für Werttypen.

Grundlegende Verwendung

Wenn Sie den null-coalescing operator (??) können Sie einen Standardwert für einen nullfähigen Typ angeben, wenn der linke Operand null .

string testString = null;
Console.WriteLine("The specified string is - " + (testString ?? "not provided"));

Live-Demo zu .NET-Geige

Das ist logisch gleichbedeutend mit:

string testString = null;
if (testString == null)
{
    Console.WriteLine("The specified string is - not provided");
}
else
{
    Console.WriteLine("The specified string is - " + testString);
}

oder mit dem ternären Operator (? :) Operator:

string testString = null;
Console.WriteLine("The specified string is - " + (testString == null ? "not provided" : testString));

Nullfall und Verkettung

Der linke Operand muss nullbar sein, während der rechte Operand möglicherweise ist oder nicht. Das Ergebnis wird entsprechend eingegeben.

Nicht nullfähig

int? a = null;
int b = 3;
var output = a ?? b;
var type = output.GetType();  

Console.WriteLine($"Output Type :{type}");
Console.WriteLine($"Output value :{output}");

Ausgabe:

Geben Sie Folgendes ein: System.Int32
Wert: 3

Demo anzeigen

Nullwert

int? a = null;
int? b = null;
var output = a ?? b;

output wird vom Typ int? und gleich b oder null .

Mehrfache Koaleszenz

Koaleszenz kann auch in Ketten erfolgen:

int? a = null;
int? b = null;
int c = 3;
var output = a ?? b ?? c;

var type = output.GetType();    
Console.WriteLine($"Type :{type}");
Console.WriteLine($"value :{output}");

Ausgabe:

Geben Sie Folgendes ein: System.Int32
Wert: 3

Demo anzeigen

Null bedingte Verkettung

Der Nullkoaleszenzoperator kann zusammen mit dem Nullausbreitungsoperator verwendet werden , um einen sichereren Zugriff auf die Eigenschaften von Objekten zu ermöglichen.

object o = null;
var output = o?.ToString() ?? "Default Value";

Ausgabe:

Geben Sie Folgendes ein: System.String
value: Standardwert

Demo anzeigen

Nullkoaleszenzoperator mit Methodenaufrufen

Mit dem Nullkoaleszenzoperator kann leicht sichergestellt werden, dass eine Methode, die möglicherweise null zurückgibt, auf einen Standardwert zurückgesetzt wird.

Ohne den Nullkoaleszenzoperator:

string name = GetName();

if (name == null)
    name = "Unknown!";

Mit dem Nullkoaleszenzoperator:

string name = GetName() ?? "Unknown!";

Vorhandene verwenden oder neu erstellen

Ein häufig verwendetes Szenario, bei dem dieses Feature wirklich hilfreich ist, ist die Suche nach einem Objekt in einer Sammlung und das Erstellen eines neuen Objekts, wenn es noch nicht vorhanden ist.

IEnumerable<MyClass> myList = GetMyList();
var item = myList.SingleOrDefault(x => x.Id == 2) ?? new MyClass { Id = 2 };

Lazy Properties-Initialisierung mit Null-Koaleszenzoperator

private List<FooBar> _fooBars;

public List<FooBar> FooBars
{
    get { return _fooBars ?? (_fooBars = new List<FooBar>()); }
}

Beim ersten Zugriff auf die Eigenschaft .FooBars wird die _fooBars Variable als null ausgewertet, sodass die Zuweisungsanweisung den _fooBars .FooBars _fooBars und auswertet.

Fadensicherheit

Dies ist keine fadensichere Methode zum Implementieren von Lazy-Eigenschaften. Verwenden Sie für Thread-sichere Faulheit die in .NET Framework integrierte Klasse Lazy<T> .

C # 6 Syntaktischer Zucker unter Verwendung von Expressionskörpern

Beachten Sie, dass diese Syntax seit C # 6 mit dem Ausdruck body für die Eigenschaft vereinfacht werden kann:

private List<FooBar> _fooBars;

public List<FooBar> FooBars => _fooBars ?? ( _fooBars = new List<FooBar>() );

Nachfolgende Zugriffe auf die Eigenschaft ergeben den in der Variablen _fooBars gespeicherten Wert.

Beispiel im MVVM-Muster

Dies wird häufig beim Implementieren von Befehlen im MVVM-Muster verwendet. Anstatt die Befehle eifrig mit der Konstruktion eines Viewmodels zu initialisieren, werden die Befehle mit diesem Muster wie folgt faul initialisiert:

private ICommand _actionCommand = null;
public ICommand ActionCommand =>
   _actionCommand ?? ( _actionCommand = new DelegateCommand( DoAction ) );


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow