C# Language
Operatore Null Coalescing
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"));
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
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
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
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 ) );