Ricerca…


Sintassi

  • ? X .Y; // null se X è nullo XY
  • ?? X .Y .Z; // null se X è null o Y è null else XYZ
  • ? X [index]; // null se X è null else X [index]
  • ? X .ValueMethod (); // null se X è null else il risultato di X.ValueMethod ();
  • ? X .VoidMethod (); // non fare nulla se X è null altrimenti chiama X.VoidMethod ();

Osservazioni

Si noti che quando si utilizza l'operatore null coalescing su un tipo di valore T si ottiene un back Nullable<T> null Nullable<T> .

Operatore Null-Conditional

Il ?. l'operatore è zucchero sintattico per evitare verosimili controlli null. È anche noto come operatore di navigazione sicura .


Classe utilizzata nell'esempio seguente:

public class Person
{
    public int Age { get; set; }
    public string Name { get; set; }
    public Person Spouse { get; set; }
}

Se un oggetto è potenzialmente nullo (come una funzione che restituisce un tipo di riferimento), l'oggetto deve prima essere verificato per null per impedire una possibile NullReferenceException . Senza l'operatore condizionale nullo, questo apparirebbe:

Person person = GetPerson();

int? age = null;
if (person != null)
    age = person.Age;

Lo stesso esempio con l'operatore null-condizionale:

Person person = GetPerson();

var age = person?.Age;    // 'age' will be of type 'int?', even if 'person' is not null

Concatenare l'operatore

L'operatore null-condizionale può essere combinato sui membri e sotto-membri di un oggetto.

// Will be null if either `person` or `person.Spouse` are null
int? spouseAge = person?.Spouse?.Age;

Combinazione con l'operatore Null-Coalescing

L'operatore null-condizionale può essere combinato con l' operatore null-coalescing per fornire un valore predefinito:

// spouseDisplayName will be "N/A" if person, Spouse, or Name is null
var spouseDisplayName = person?.Spouse?.Name ?? "N/A";

L'indice Null-Conditional

Allo stesso modo del ?. operatore, l'operatore indice condizionale null verifica i valori nulli durante l'indicizzazione in una raccolta che può essere nullo.

string item = collection?[index];

è zucchero sintattico per

string item = null;
if(collection != null)
{
    item = collection[index];
}

Evitare NullReferenceExceptions

var person = new Person
{
    Address = null;
};

var city = person.Address.City; //throws a NullReferenceException
var nullableCity = person.Address?.City; //returns the value of null

Questo effetto può essere concatenato:

var person = new Person
{
    Address = new Address
    {
        State = new State
        {
            Country = null
        }
    }
};

// this will always return a value of at least "null" to be stored instead
// of throwing a NullReferenceException
var countryName = person?.Address?.State?.Country?.Name; 

L'operatore con condizioni null può essere utilizzato con il metodo di estensione

Il metodo di estensione può funzionare su riferimenti null , ma puoi usare ?. per null controllare in ogni caso.

public class Person 
{
    public string Name {get; set;}
}

public static class PersonExtensions
{
    public static int GetNameLength(this Person person)
    {
        return person == null ? -1 : person.Name.Length;
    }
}

Normalmente, il metodo verrà attivato per riferimenti null e restituirà -1:

Person person = null;
int nameLength = person.GetNameLength(); // returns -1

Usando ?. il metodo non verrà attivato per riferimenti null e il tipo è int? :

Person person = null;
int? nameLength = person?.GetNameLength(); // nameLength is null.

Questo comportamento è in realtà previsto dal modo in cui il ?. L'operatore lavora: eviterà di effettuare chiamate al metodo di istanza per istanze nulle, al fine di evitare NullReferenceExceptions . Tuttavia, la stessa logica si applica al metodo di estensione, nonostante la differenza su come viene dichiarato il metodo.

Per ulteriori informazioni sul motivo per cui viene chiamato il metodo di estensione nel primo esempio, consultare i metodi di estensione - documentazione di controllo nullo .



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