Что значит "?" после переменной в С#?
Что означает это условие?
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......).