Cosa significa x? .Y? .Z significa?

La bozza delle specifiche per Pattern Matching in C # contiene il seguente esempio di codice:

Type? v = x?.y?.z; if (v.HasValue) { var value = v.GetValueOrDefault(); // code using value } 

Capisco quel Type? indica che Type è nullable, ma supponendo che x , y e z siano locali, che cosa significa x?.y?.z significa?

Tieni presente che questa lingua è disponibile solo in C # 6 e versioni successive.

È effettivamente l’equivalente di:

 x == null ? null : xy == null ? null : xyz 

In altre parole, è un modo “sicuro” di fare xyz , dove qualsiasi proprietà lungo il percorso potrebbe essere nulla.

Anche correlato è l’ operatore coalescente null (??) , che fornisce valori per sostituire null .

Operatore di propagazione nulla / Operatore non condizionale ?. una nuova funzione proposta in C # 6.0

x?.y?.z significa

  • prima, controlla se x non è nullo, quindi controlla y altrimenti restituisce null,
  • in secondo luogo, quando x non è nullo, allora verifica y , se non è nullo, quindi restituisci z altrimenti restituisce null.

Il valore di ritorno massimo sarà z o null .

Senza questo operatore se x è nullo, l’accesso a xy solleverebbe un’eccezione di riferimento Null, l’operatore Null-Conditional aiuta ad evitare il controllo esplicito di null.

È un modo per evitare l’eccezione di riferimento Null.

Vedi: Capire le imminenti funzionalità linguistiche in C #

8 – Operatori non condizionali

A volte il codice tende ad annegare un po ‘nel controllo dei null. L’operatore null-condizionale consente di accedere a membri ed elementi solo quando il ricevente non è nullo, fornendo altrimenti un risultato nullo:

 int? length = customers?.Length; // null if customers is null 
  this.SlimShadies.SingleOrDefault(s => s.IsTheReal)?.PleaseStandUp(); 

Fondamentalmente.