Что означает это условие?
if (!helper?.Settings.HasConfig ?? false)
P.S.
-
helper
является переменной некоторого класса -
Settings
- это какое-то поле -
HasConfig
тоже поле.
Что означает это условие?
if (!helper?.Settings.HasConfig ?? false)
P.S.
helper
является переменной некоторого классаSettings
- это какое-то полеHasConfig
тоже поле. Ну что ?.
нуль-условный оператор
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)))
Проверьте список операторов С#:
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 произойдет.
?.
Оператор известен как 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
.
Это основы. Сила этой функции исходит из всех сценариев, где эта функция позволяет использовать более чистый код.
Он проверяет, не является ли "помощник" не "NULL" перед тем, как использовать свойство "Настройки", чтобы избежать исключения NullReferenceException. https://msdn.microsoft.com/en-us/library/dn986595.aspx "Старый" способ был таким: if (helper!= Null &! Helper.Settings......).