Что значит "?" после переменной в С#?

Что означает это условие?

if (!helper?.Settings.HasConfig ?? false)

P.S.

  • helper является переменной некоторого класса
  • Settings - это какое-то поле
  • HasConfig тоже поле.

Ответ 1

Ну что ?. нуль-условный оператор

https://msdn.microsoft.com/en-us/library/dn986595.aspx

x?.y

означает вернуть null если x ноль и xy противном случае

?? является оператором с нулевым слиянием

https://msdn.microsoft.com/en-us/library/ms173224.aspx

x ?? y

означает, что если x == null вернуть y, иначе x

Сочетая все вышеперечисленное

helper?.Settings.HasConfig ?? false

означает: вернуть false если

helper == null or
helper.Settings.HasConfig == null

в противном случае возврат

helper.Settings.HasConfig

Код без ?? и ?. if можно переписать в громоздкий

if (!(helper == null 
        ? false
        : (helper.Settings.HasConfig == null 
             ? false
             : helper.Settings.HasConfig))) 

Ответ 2

Проверьте список операторов С#:

x?.y - нулевой условный членский доступ. Возвращает ноль, если левый операнд нуль.

Икс?? y - возвращает x, если оно не равно нулю; в противном случае возвращает y.

Так что helper?.Settings вернет helper?.Settings, если helper равен нулю, иначе он вернет helper.Settings

если helper.Settings не равно NULL и helper.Settings.HasConfig не равно NULL, то он вернет значение helper.Settings.HasConfig противном случае вернет false.

NB: если helper?.Settings имеет значение null, исключение ссылки NULL произойдет.

Ответ 3

?. Оператор известен как safe navigation operator, введенный в С# 6. Синтаксис Null Conditional Operator

Нулевой условный оператор (?.) в разговорной речи называется "Elvis operator" из-за его сходства с парой темных глаз под большим притоком волос. Нулевым условием является форма оператора доступа к члену (.). Здесь упрощенное объяснение нулевого условного оператора:

Выражение A?.B оценивается как B, если левый операнд (A) не равен нулю; в противном случае он оценивает тонну.

Более подробная информация определяется положением:

  • Тип выражения A?.B - тип B, в случаях, когда B - ссылочный тип. Если B - тип значения, выражение A?.B является nullable type, который обертывает базовый тип значения, представленный B.

  • Спецификация функции указывает, что A будет оцениваться без больше чем единожды.

  • Короткие замыкания нулевого оператора, что означает, что вы может связывать несколько?.операторов, зная, что первый нуль столкнулся с препятствиями для оставшихся (самых правых) компонентов выражение от оценки.

Пример: - Предположим, что у нас есть класс Стьюдента

public class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

Предположим, что s представляет ученика. Рассмотрим эти два утверждения:

var name = s?.FirstName;
var age = s?.Age;

Имя переменной - это строка. Значение имени зависит от значения s. Если s равно null, имя равно null. Если s не является нулевым, имя - это значение s.FirstName. Обратите внимание, что s.FirstName может быть нулевым, даже если s не является.

Возраст переменной - это int? (что является другим способом указания Nullable). Как и имя, значение возраста зависит от значения s. Если s null, возраст - int? без значения. Если s не равно null, возраст - это завернутое значение s.Age.

Это основы. Сила этой функции исходит из всех сценариев, где эта функция позволяет использовать более чистый код.

Ответ 4

Он проверяет, не является ли "помощник" не "NULL" перед тем, как использовать свойство "Настройки", чтобы избежать исключения NullReferenceException. https://msdn.microsoft.com/en-us/library/dn986595.aspx "Старый" способ был таким: if (helper!= Null &! Helper.Settings......).