C# Language
Nullkoaleszenzoperator
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"));
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
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
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
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 ) );