Описание тега null-propagation-operator

Оператор распространения значений NULL, представленный в C# 6.0, устраняет необходимость в нескольких проверках NULL в цепочке вызовов методов.

Оператор нулевого распространения был представлен в C# 6.0.

Это устраняет необходимость в нескольких проверках на null в цепочке вызовов методов, возвращая null когда вызываемый объект nullвместо вызова целевого метода (или доступа к целевому свойству) и выдачи NullReferenceException.

string name = null;

int? nameLength = name?.Length;  // stores null in nameLength

Преимущество становится более очевидным при работе с длинными цепочками вызовов.

Представьте себе серию простых классов, определенных следующим образом:

public class ClassRoom
{
    public List<Student> Students { get; set; }
}

public class Student
{
    public List<Subject> Subjects { get; set; }
}

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

Безопасный доступ к длине имени субъекта, если только ему предоставлено ClassRoom, требует несколько длинного и повторяющегося кода:

int? nameLength = null;

if (c != null
    && c.Students != null
    && c.Students.Count > 0
    && c.Students[0].Subjects != null
    && c.Students[0].Subjects.Count > 0
    && c.Students[0].Subjects[0].Name != null)
{
    nameLength = c.Students[0].Subjects[0].Name.Length;
}

Тот же код, переписанный с использованием оператора нулевого распространения:

int? nameLength = c?.Students?[0].Subjects?[0].Name?.Length;