Наткнулся на эту строку кода:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Что означают два вопросительных знака, это какой-то троичный оператор? Трудно найти в Google.
c#
null-coalescing-operator
Эдвард Тангей
источник
источник
Ответы:
Это оператор объединения нулей, и он очень похож на троичный (немедленный, если) оператор. Смотрите также ?? Оператор - MSDN .
расширяется до:
который далее расширяется до:
В английском это означает «Если то, что слева, не равно нулю, используйте это, в противном случае используйте то, что справа».
Обратите внимание, что вы можете использовать любое количество из них в последовательности. Следующий оператор назначит первое ненулевое
Answer#
значениеAnswer
(если все ответы имеют значение NULL, то значениеAnswer
NULL):Также стоит упомянуть, хотя приведенное выше расширение концептуально эквивалентно, результат каждого выражения оценивается только один раз. Это важно, если, например, выражение является вызовом метода с побочными эффектами. (Благодарим @Joey за указание на это.)
источник
??
остается ассоциативным, такa ?? b ?? c ?? d
что эквивалентно((a ?? b) ?? c ) ?? d
. «Операторы присваивания и троичный оператор (? :) ассоциативны справа. Все остальные бинарные операторы ассоциативны слева». Источник: msdn.microsoft.com/en-us/library/ms173145.aspxПросто потому, что никто еще не сказал волшебные слова: это нулевой оператор объединения . Это определено в разделе 7.12 спецификации языка C # 3.0 .
Это очень удобно, особенно из-за того, как оно работает, когда оно используется в выражении несколько раз. Выражение формы:
выдаст результат выражения,
a
если оно не равно нулю, в противном случае попробуйтеb
, в противном случае попробуйтеc
, в противном случае попробуйтеd
. Это короткое замыкание в каждой точке.Кроме того, если тип
d
не обнуляется, тип целого выражения также не обнуляется.источник
Это нулевой оператор объединения.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
Да, почти невозможно искать, если вы не знаете, как это называется! :-)
РЕДАКТИРОВАТЬ: И это классная особенность из другого вопроса. Вы можете связать их
Скрытые возможности C #?
источник
Спасибо всем, вот самое краткое объяснение, которое я нашел на сайте MSDN:
источник
-1
это просто обычноеint
, не обнуляемое).x
имеет типint?
, ноy
имеет типint
, вы можете написатьint y = (int)(x ?? -1)
. Он будет разбиратьx
Аня ,int
если это неnull
, или назначить-1
вy
случаеx
этоnull
.??
там, чтобы обеспечить значение для обнуляемого типа, когда значение равно нулю. Итак, если formsAuth равен нулю, он вернет новый FormsAuthenticationWrapper ().источник
Два знака вопроса (??) указывают на то, что это оператор объединения.
Оператор объединения возвращает первое значение NON-NULL из цепочки. Вы можете увидеть это видео на YouTube, которое демонстрирует практически все это.
Но позвольте мне добавить больше к тому, что говорит видео.
Если вы видите английское значение объединения, оно говорит: «объединяйтесь». Например, ниже приведен простой объединяющий код, который объединяет четыре строки.
Так что, если
str1
этоnull
будет старатьсяstr2
, еслиstr2
этоnull
будет старатьсяstr3
и так далее до тех пор , пока не найдет строку со значением ненулевым.Проще говоря, оператор Coalescing возвращает первое значение NON-NULL из цепочки.
источник
Это короткая рука для троичного оператора.
Или для тех, кто не делает троичный
источник
!= null
), и второеformsAuth
(после?
) могут быть изменены; в форме слияния null оба неявно принимают введенные вами значения.Если вы знакомы с Ruby, мне
||=
кажется, что он похож на C #??
. Вот немного Ruby:И в C #:
источник
x ||= y
Desugars на что-то вродеx = x || y
, так??
что на самом деле больше похоже на обычный||
в Ruby.??
только заботится оnull
, в то время как||
оператор в Ruby, как и в большинстве языков, больше оnull
,false
или что - нибудь , что можно рассматривать как логическое со значениемfalse
(например , в некоторых языках,""
). Это не хорошо или плохо, просто разница.оператор объединения
это эквивалентно
источник
Ничего опасного в этом нет. На самом деле это красиво. Вы можете добавить значение по умолчанию, если это желательно, например:
КОД
источник
int? x1 = null;
верно ли этоx1
-x4
должен быть обнуляемыми типами: это не имеет никакого смысла говорить, по сути, «результат ,0
еслиx4
этому значение , которое оно не может принять» (null
). «Обнуляемый тип» здесь включает , конечно, как обнуляемые типы значений, так и ссылочные типы. Это ошибка времени компиляции, если одна или несколько цепочечных переменных (кроме последней) не обнуляются.Как правильно указывалось в многочисленных ответах, это «оператор слияния нулей» ( ?? ), о котором можно также упомянуть его двоюродного брата « оператор с нулевым условием» ( ? Или ? [ ), Который является оператором, который много раз он используется в сочетании с ??
Нулевой оператор
Например:
по-старому без ? и ?? делать это
который является более многословным и громоздким.
источник
Только для вашего развлечения (зная, что вы все ребята из C # ;-).
Я думаю, что он возник в Smalltalk, где он существует уже много лет. Там это определяется как:
в объекте:
в UndefinedObject (он же класс nil):
Существуют как оценочные (?), Так и не оценивающие версии (??) этого.
Это часто встречается в методах-получателях для приватных инициализируемых переменных (экземпляра), которые остаются нулевыми до тех пор, пока они действительно не понадобятся.
источник
Некоторые примеры получения значений с использованием коалесценции здесь неэффективны.
То, что вы действительно хотите, это:
или
Это предотвращает воссоздание объекта каждый раз. Вместо того, чтобы приватная переменная оставалась нулевой, а новый объект создавался при каждом запросе, это гарантирует, что приватная переменная будет назначена, если будет создан новый объект.
источник
??
оценивается ли короткий путь?new FormsAuthenticationWrapper();
оценивается тогда и только тогда, когда_formsAuthWrapper
ноль.Замечания:
Я прочитал всю эту ветку и многие другие, но не могу найти такой исчерпывающий ответ, как этот.
По которому я полностью понял «зачем использовать ?? и когда использовать ?? и как использовать ??."
Источник:
Основа коммуникации Windows выпущена Крейгом МакМертри ISBN 0-672-32948-4
Типы значений Nullable
Существует два распространенных обстоятельства, в которых хотелось бы узнать, было ли присвоено значение экземпляру типа значения. Первый - это когда экземпляр представляет значение в базе данных. В таком случае хотелось бы иметь возможность изучить экземпляр, чтобы выяснить, действительно ли значение присутствует в базе данных. Другое обстоятельство, которое в большей степени относится к предмету этой книги, - это когда экземпляр представляет элемент данных, полученный из некоторого удаленного источника. Опять же, хотелось бы определить из экземпляра, было ли получено значение для этого элемента данных.
.NET Framework 2.0 включает определение универсального типа, которое обеспечивает случаи, подобные этим, в которых нужно присвоить значение NULL экземпляру типа значения и проверить, является ли значение экземпляра NULL. Это определение универсального типа - System.Nullable, которое ограничивает аргументы универсального типа, которые могут быть заменены на T, значениями типов. Экземплярам типов, созданным из System.Nullable, может быть присвоено значение null; действительно, их значения по умолчанию равны нулю. Таким образом, типы, созданные из System.Nullable, могут упоминаться как типы значений, допускающие значение NULL. System.Nullable имеет свойство Value, с помощью которого можно получить значение, назначенное экземпляру созданного из него типа, если значение экземпляра не равно нулю. Поэтому можно написать:
Язык программирования C # предоставляет сокращенный синтаксис для объявления типов, созданных из System.Nullable. Этот синтаксис позволяет сокращать:
в
Компилятор предотвратит попытку присвоить значение типа значения, допускающего значение NULL, обычному типу значения следующим образом:
Это не позволяет сделать это, потому что тип значения NULL может иметь значение NULL, что в действительности имеет значение, и это значение не может быть присвоено обычному типу значения. Хотя компилятор разрешил бы этот код,
Второй оператор вызовет исключение, потому что любая попытка доступа к свойству System.Nullable.Value является недопустимой операцией, если типу, созданному из System.Nullable, не было присвоено допустимое значение T, чего не было в этом случае. дело.
Вывод:
Один из правильных способов присвоить значение типа значения, допускающего значение NULL, обычному типу значения - это использовать свойство System.Nullable.HasValue, чтобы определить, было ли назначено допустимое значение T для типа значения NULL.
Другой вариант - использовать этот синтаксис:
С помощью которого обычному целому числу myInteger присваивается значение обнуляемого целого числа «myNullableInteger», если последнему присвоено допустимое целочисленное значение; в противном случае myInteger присваивается значение -1.
источник
Это нулевой оператор объединения, который работает аналогично троичному оператору.
Еще один интересный момент для этого: «Обнуляемый тип может содержать значение или он может быть неопределенным» . Таким образом, если вы попытаетесь назначить тип значения NULL для значения NULL, вы получите ошибку во время компиляции.
Так сделать это с помощью ?? оператор:
источник
эквивалентно
Но самое интересное в том, что вы можете связать их, как говорили другие люди. Единственное, что не касается, - это то, что вы можете использовать его для исключения.
источник
??
Оператор называется нуль-сливающихся оператор. Возвращает левый операнд, если операнд не равен нулю; в противном случае он возвращает правый операнд.Установить
variable2
в значениеvariable1
, если неvariable1
является нулевым; в противном случае, еслиvariable1 == null
установленоvariable2
на 100.источник
Другие описали это
Null Coalescing Operator
довольно хорошо. Для тех, кто заинтересован, существует сокращенный синтаксис, где это (вопрос SO):FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
эквивалентно этому:
FormsAuth ??= new FormsAuthenticationWrapper();
Некоторые считают его более читаемым и лаконичным.
источник