?.?. Условные операции со значением "null" (and ?[]) в C# и Visual Basicand ?[] null-conditional operators (C# and Visual Basic)

Проверяет значение левого операнда на наличие значения NULL перед выполнением операции доступа к элементу (?.) или индексу (?[]). Возвращает null, если левый операнд имеет значение null.Tests the value of the left-hand operand for null before performing a member access (?.) or index (?[]) operation; returns null if the left-hand operand evaluates to null.

Эти операторы позволяют писать меньше кода для проверок значений null, особенно если речь идет о внедрении в структуры данных.These operators help you write less code to handle null checks, especially for descending into data structures.

int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];  // null if customers is null
int? count = customers?[0]?.Orders?.Count();  // null if customers, the first customer, or Orders is null

Операторы с условием NULL предусматривают сокращенную обработку.The null-conditional operators are short-circuiting. Если одна из операций в цепочке условных операций доступа к члену и операций индексирования возвращает значение NULL, то выполнение остальной части цепочки прекращается.If one operation in a chain of conditional member access and index operations returns null, the rest of the chain’s execution stops. В приведенном ниже примере E не выполняется, если A, B или C имеет значение NULL.In the following example, E doesn't execute if A, B, or C evaluates to null.

A?.B?.C?.Do(E);
A?.B?.C?[E];

Другим примером использования для доступа к элементам с условием NULL является вызов делегатов в потокобезопасном режиме с существенно меньшим объемом кода.Another use for the null-conditional member access is invoking delegates in a thread-safe way with much less code. Для старого способа требуется примерно следующий код:The old way requires code like the following:

var handler = this.PropertyChanged;
if (handler != null)
    handler(…);

Новый способ гораздо проще:The new way is much simpler:

PropertyChanged?.Invoke(…)

Новый способ является потокобезопасным, так как компилятор создает код для вычисления PropertyChanged только один раз, запоминая результат во временной переменной.The new way is thread-safe because the compiler generates code to evaluate PropertyChanged one time only, keeping the result in a temporary variable. Необходимо явно вызывать метод Invoke, так как отсутствует синтаксис PropertyChanged?(e) для вызова делегатов с условием NULL.You need to explicitly call the Invoke method because there is no null-conditional delegate invocation syntax PropertyChanged?(e).

Спецификации языковLanguage specifications

Дополнительные сведения см. в разделе об операторах с условием NULL в Спецификации языка C#.For more information, see Null-conditional operator in the C# Language Specification. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.The language specification is the definitive source for C# syntax and usage.

См. такжеSee also