Szukaj…


Składnia

  • X? .Y; // null, jeśli X jest null, inaczej XY
  • X? .Y? .Z; // null, jeśli X jest null lub Y jest null, w przeciwnym razie XYZ
  • X? [Indeks]; // null, jeśli X jest null, w przeciwnym razie X [indeks]
  • X? .ValueMethod (); // null, jeśli X jest null, w przeciwnym razie wynik X.ValueMethod ();
  • X? .VoidMethod (); // nic nie rób, jeśli X ma wartość null, w przeciwnym razie wywołaj X.VoidMethod ();

Uwagi

Zauważ, że jeśli użyjesz zerowego operatora koalescencyjnego dla wartości typu T , otrzymasz z powrotem Nullable<T> .

Operator nieważny

?. operator jest składniowym cukrem, aby uniknąć pełnych kontroli zerowych. Jest również znany jako operator Bezpiecznej nawigacji .


Klasa użyta w następującym przykładzie:

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

Jeśli obiekt ma potencjalnie wartość NULL (taką jak funkcja zwracająca typ odwołania), należy najpierw sprawdzić obiekt pod kątem wartości NULL, aby zapobiec możliwemu wyjątkowi NullReferenceException . Bez operatora warunkowego zerowego wyglądałoby to tak:

Person person = GetPerson();

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

Ten sam przykład z wykorzystaniem operatora zerowego-warunkowego:

Person person = GetPerson();

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

Łańcuch operatora

Operator warunkowy o wartości zerowej można łączyć na elementach i elementach podrzędnych obiektu.

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

W połączeniu z operatorem zerowania koalescencji

Operator zerowo-warunkowy można połączyć z operatorem zerowo-koalescencyjnym, aby uzyskać wartość domyślną:

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

Indeks zerowy-warunkowy

Podobnie jak ?. operator, operator indeksu warunkowego null sprawdza wartości null podczas indeksowania do kolekcji, która może być null.

string item = collection?[index];

jest cukrem syntaktycznym dla

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

Unikanie wyjątków NullReferenceException

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

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

Ten efekt można połączyć razem:

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; 

Operator zerowy-warunkowy może być używany z Metodą rozszerzenia

Metoda rozszerzenia może działać na referencjach zerowych , ale możesz użyć ?. i tak sprawdzić zerowo.

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

Zwykle metoda zostanie uruchomiona dla odwołań null i zwróci -1:

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

Używasz ?. metoda nie zostanie uruchomiona dla referencji o null , a typem jest int? :

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

Tego zachowania można się spodziewać po sposobie, w jaki ?. operator działa: uniknie wywoływania metod instancji dla instancji zerowych, aby uniknąć NullReferenceExceptions . Jednak ta sama logika dotyczy metody rozszerzenia, pomimo różnicy w sposobie deklarowania metody.

Aby uzyskać więcej informacji o tym, dlaczego metoda rozszerzenia jest wywoływana w pierwszym przykładzie, zobacz Metody metod rozszerzenia - dokumentacja sprawdzania wartości zerowej .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow