C# Language
Null-Coalescing-operatör
Sök…
Syntax
- var resultat = möjligtNullObjekt ?? standardvärde;
parametrar
Parameter | detaljer |
---|---|
possibleNullObject | Värdet som ska testas för nollvärde. Om det inte är noll returneras detta värde. Måste vara en nullable typ. |
defaultValue | Värdet som returneras om possibleNullObject är noll. Måste vara av samma typ som possibleNullObject . |
Anmärkningar
Operatören null-sammansmältning är två i följd tecken från frågetecken: ??
Det är en korthet för det villkorade uttrycket:
possibleNullObject != null ? possibleNullObject : defaultValue
Operandan på vänster sida (objektet som testas) måste vara av en nullabar värdetyp eller referenstyp, annars kommer ett kompileringsfel att inträffa.
?? operatör fungerar för både referenstyper och värdetyper.
Grundläggande användning
Med hjälp av null-coalescing operator (??)
kan du ange ett standardvärde för en nullable typ om null-coalescing operator (??)
vänster är null
.
string testString = null;
Console.WriteLine("The specified string is - " + (testString ?? "not provided"));
Live-demonstration på .NET Fiddle
Detta motsvarar logiskt:
string testString = null;
if (testString == null)
{
Console.WriteLine("The specified string is - not provided");
}
else
{
Console.WriteLine("The specified string is - " + testString);
}
eller använder den ternära operatören (? :) :
string testString = null;
Console.WriteLine("The specified string is - " + (testString == null ? "not provided" : testString));
Noll genomgång och kedja
Den vänstra operanden måste vara nullable, medan den högra operanden kan vara eller inte. Resultatet kommer att skrivas i enlighet därmed.
Icke-null
int? a = null;
int b = 3;
var output = a ?? b;
var type = output.GetType();
Console.WriteLine($"Output Type :{type}");
Console.WriteLine($"Output value :{output}");
Produktion:
Typ: System.Int32
värde: 3
null
int? a = null;
int? b = null;
var output = a ?? b;
output
kommer att vara av typen int?
och lika med b
eller null
.
Flera coalescing
Koalescing kan också göras i kedjor:
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}");
Produktion:
Typ: System.Int32
värde: 3
Null Villkorlig kedja
Nollkoalesceringsoperatören kan användas i tandem med nollutbredningsoperatören för att ge säkrare tillgång till objektens egenskaper.
object o = null;
var output = o?.ToString() ?? "Default Value";
Produktion:
Typ: System.String
värde: Standardvärde
Noll samverkande operatör med metodsamtal
Operatören för nollkolning gör det enkelt att säkerställa att en metod som kan returnera null
faller tillbaka till ett standardvärde.
Utan nollkoalesceringsoperatören:
string name = GetName();
if (name == null)
name = "Unknown!";
Med operatören null coalescing:
string name = GetName() ?? "Unknown!";
Använd befintliga eller skapa nya
Ett vanligt användarscenario som den här funktionen verkligen hjälper till är när du letar efter ett objekt i en samling och behöver skapa ett nytt om det inte redan finns.
IEnumerable<MyClass> myList = GetMyList();
var item = myList.SingleOrDefault(x => x.Id == 2) ?? new MyClass { Id = 2 };
Initialisering av lata egenskaper med operatören null coalescing
private List<FooBar> _fooBars;
public List<FooBar> FooBars
{
get { return _fooBars ?? (_fooBars = new List<FooBar>()); }
}
Första gången egenskapen .FooBars
öppnas _fooBars
variabeln _fooBars
att utvärderas som null
, och därmed faller till tilldelningsuppgiften tilldelar och utvärderar det resulterande värdet.
Gängsäkerhet
Detta är inte ett trådlöst sätt att implementera lata egenskaper. För trådsäker latskap använder du klassen Lazy<T>
inbyggd i .NET Framework.
C # 6 Syntaktiskt socker med hjälp av uttryckskroppar
Observera att sedan C # 6 kan denna syntax förenklas med uttryckskroppen för egenskapen:
private List<FooBar> _fooBars;
public List<FooBar> FooBars => _fooBars ?? ( _fooBars = new List<FooBar>() );
Senare åtkomst till egenskapen ger värdet lagrat i variabeln _fooBars
.
Exempel i MVVM-mönstret
Detta används ofta när man implementerar kommandon i MVVM-mönstret. I stället för att initialisera kommandona ivrigt med konstruktionen av en visningsmodell, initialiseras kommandon lata med hjälp av detta mönster enligt följande:
private ICommand _actionCommand = null;
public ICommand ActionCommand =>
_actionCommand ?? ( _actionCommand = new DelegateCommand( DoAction ) );