Что означает x?.y?.z?

Спецификация для Соответствие шаблонов в С# содержит следующий пример кода:

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

Я понимаю, что Type? указывает, что Type имеет значение NULL, но если предположить, что x, y и z являются локальными, то что означает x?.y?.z?

Ответ 1

Помните, что эта языковая функция доступна только на С# 6 и более поздних версиях.

Это фактически эквивалент:

x == null ? null
   : x.y == null ? null
   : x.y.z

Другими словами, это "безопасный" способ сделать x.y.z, где любое из свойств по пути может быть нулевым.

Также связан оператор null coalescing (??), который предоставляет значения для замены null.

Ответ 2

Это Null-распространяющий оператор /Null -Conditional Operator?. новая предлагаемая функция в С# 6.0

x?.y?.z означает

  • сначала проверьте, не является ли x null, затем проверить y иначе вернуть null,
  • second, когда x не является нулевым, тогда проверьте y, если он не равен null, тогда return z иначе возвращает null.

Конечное возвращаемое значение будет z или null.

Без этого оператора, если x имеет значение NULL, доступ к x.y приведет к созданию Null Reference Exception, оператор Null-Conditional поможет избежать явной проверки на null.

Это способ избежать Null Reference Exception.

Смотрите: Получение представления о предстоящих языковых возможностях в С#

8 - Нулевые условные операторы

Иногда код имеет тенденцию заглушить бит при нулевой проверке. null-условный оператор позволяет вам только доступ к элементам и элементам когда приемник не равен-null, в противном случае будет иметь нулевой результат:

int? length = customers?.Length; // null if customers is null

Ответ 3

 this.SlimShadies.FirstOrDefault(s => s.IsTheReal)?.PleaseStandUp();

В принципе.