Ricerca…


Sintassi

  • var result = possibleNullObject ?? valore predefinito;

Parametri

Parametro Dettagli
possibleNullObject Il valore da verificare per il valore nullo. Se non è nullo, questo valore viene restituito. Deve essere un tipo nullable.
defaultValue Il valore restituito se possibleNullObject è null. Deve essere lo stesso tipo possibleNullObject di possibleNullObject .

Osservazioni

Lo stesso operatore a coalescenza nulla è costituito da due caratteri consecutivi di punti interrogativi: ??

È una scorciatoia per l'espressione condizionale:

possibleNullObject != null ? possibleNullObject : defaultValue

L'operando di sinistra (oggetto in fase di test) deve essere un tipo di valore o un tipo di riferimento nullable o si verificherà un errore di compilazione.

Il ?? l'operatore lavora sia per i tipi di riferimento che per i tipi di valore.

Utilizzo di base

L'utilizzo null-coalescing operator (??) consente di specificare un valore predefinito per un tipo nullable se l'operando di sinistra è null .

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

Live Demo su .NET Fiddle

Questo è logicamente equivalente a:

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

o usando l' operatore ternario (? :) operator:

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

Fallimento nullo e concatenamento

L'operando di sinistra deve essere annullabile, mentre l'operando di destra può essere o meno. Il risultato verrà digitato di conseguenza.

Non annullabile

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

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

Produzione:

Tipo: System.Int32
valore: 3

Visualizza la demo

nullable

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

output sarà di tipo int? e uguale a b , o null .

Coalescenza multipla

La coalescenza può anche essere eseguita in catene:

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

Produzione:

Tipo: System.Int32
valore: 3

Visualizza la demo

Concatenamento condizionale nullo

L'operatore null coalescing può essere utilizzato in tandem con l' operatore di propagazione null per fornire un accesso più sicuro alle proprietà degli oggetti.

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

Produzione:

Tipo: System.String
valore: valore predefinito

Visualizza la demo

Operatore coalescente Null con chiamate di metodo

L'operatore null coalescente semplifica l'assicurare che un metodo che può restituire null ricada su un valore predefinito.

Senza l'operatore null coalescente:

string name = GetName();

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

Con l'operatore null coalescente:

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

Usa esistente o crea nuovo

Uno scenario di utilizzo comune a cui questa funzione è davvero utile è quando si cerca un oggetto in una raccolta e occorre crearne uno nuovo se non esiste già.

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

Inizializzazione delle proprietà Lazy con operatore coalescente null

private List<FooBar> _fooBars;

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

La prima volta che si accede alla proprietà .FooBars la variabile _fooBars verrà valutata come null , passando quindi all'istruzione di assegnazione assegna e valuterà il valore risultante.

Filo di sicurezza

Questo non è un modo sicuro per implementare le proprietà lazy. Per la pigrizia sicura dei thread, utilizzare la classe Lazy<T> integrata in .NET Framework.

Zucchero sintattico C # 6 usando corpi di espressione

Nota che dal C # 6, questa sintassi può essere semplificata usando il corpo di espressione per la proprietà:

private List<FooBar> _fooBars;

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

Gli accessi successivi alla proprietà produrranno il valore memorizzato nella variabile _fooBars .

Esempio nel modello MVVM

Questo è spesso usato quando si implementano comandi nel pattern MVVM. Invece di inizializzare i comandi con entusiasmo con la costruzione di un viewmodel, i comandi vengono inizializzati pigramente usando questo modello come segue:

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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow