Пробежал по этой строке кода:
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
Что означают два вопросительных знака, это какой-то троичный оператор? Трудно найти в Google.
Это - пустой оператор объединения, и вполне как троичное (непосредственный - если) оператор. См. также ?? Оператор - MSDN.
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
расширяется до:
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
, который далее расширяется до:
if(formsAuth != null)
FormsAuth = formsAuth;
else
FormsAuth = new FormsAuthenticationWrapper();
На английском языке, это означает, "Если то независимо от того, что налево, не является пустым, используйте это, иначе используйте то, что направо".
Примечание, что можно использовать любое количество их в последовательности. Следующее утверждение присвоит первый непустой указатель Answer#
Answer
(если все Ответы будут пустыми тогда эти Answer
, является пустым):
string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;
<час> Также это стоит упомянуть, в то время как расширение выше концептуально эквивалентно, результат каждого выражения только оценен однажды. Это важно, если, например, выражение является вызовом метода с побочными эффектами. (Кредит к @Joey для указания на это.)
объединение оператора
это эквивалентно
FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth
Это - стенография для тернарного оператора.
FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();
Или для тех, кто не делает троичный:
if (formsAuth != null)
{
FormsAuth = formsAuth;
}
else
{
FormsAuth = new FormsAuthenticationWrapper();
}
??
там для обеспечения значения для nullable типа, когда значение является пустым. Так, если formsAuth будет пустым, он возвратит новый FormsAuthenticationWrapper ().
Спасибо все, вот самое сжатое объяснение, которое я нашел на сайте MSDN:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
-1
просто плоскость int
, который является не допускающим NULL-значения).
– Georges Dupéron
18.05.2020, 21:27
Это - пустой оператор объединения.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
Да, почти невозможный искать, если Вы не знаете то, чем это называют!:-)
РЕДАКТИРОВАНИЕ: И это - замечательная функция от другого вопроса. Можно объединить их в цепочку.
Для Вашего развлечения только (знающий Вас все парни C#;-).
я думаю, что это произошло в Smalltalk, где это было вокруг много лет. Это определяется там как:
в Объекте:
? anArgument
^ self
в UndefinedObject (иначе класс ноля):
? anArgument
^ anArgument
Там и оценивают (?) и не оценивают версии (??) из этого.
Это часто находится в методах получателя для лениво инициализированного, частного (экземпляр) переменные, которым оставляют ноль, пока действительно не необходимый.
Просто, потому что никто еще еще не сказал волшебные слова: это пустой оператор объединения. Это определяется в разделе 7.12 из спецификация языка .
C# 3.0, Это очень удобно, особенно из-за способа, которым это работает, когда это используется многократно в выражении. Выражение формы:
a ?? b ?? c ?? d
даст результат выражения a
, если это будет непустым, иначе попробуйте b
, иначе попробуйте c
, иначе попробуйте d
. Это закорачивает в каждой точке.
кроме того, если тип d
является не допускающим NULL-значения, тип целого выражения является не допускающим NULL-значения также.