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

Visa demo

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

Visa demo

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

Visa demo

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 ) );


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow