Что означают два знака вопроса вместе в C #?

Пробежал по этой строке кода:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

Что означают два вопросительных знака, это какой-то троичный оператор? Трудно найти в Google.

1509
задан 18.05.2020, 21:24

8 ответов

Это - пустой оператор объединения, и вполне как троичное (непосредственный - если) оператор. См. также ?? Оператор - 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 для указания на это.)

2012
ответ дан 18.05.2020, 21:30
  • 1
    Потенциально опасный для объединения в цепочку их, возможно, – Coops 18.05.2020, 21:30
  • 2
    didn´ t знают, что можно было объединить их в цепочку – Seiti 18.05.2020, 21:30
  • 3
    Это была бы удача, если это работало на пустые строки также:) – Zyphrax 18.05.2020, 21:31
  • 4
    @CodeBlend, it' s не опасный. Если необходимо было развернуть you' d просто имеют серию вложенных если/еще операторы. Синтаксис является просто странным потому что you' ре, не привыкшее к наблюдению его. – joelmdev 18.05.2020, 21:32

объединение оператора

это эквивалентно

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth
11
ответ дан 18.05.2020, 21:25

Это - стенография для тернарного оператора.

FormsAuth = (formsAuth != null) ? formsAuth : new FormsAuthenticationWrapper();

Или для тех, кто не делает троичный:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}
11
ответ дан 18.05.2020, 21:26
  • 1
    I' ve только исправил написание " ternary" но действительно оператор, который Вы имеете в виду, является условным оператором. Это, оказывается, единственный тернарный оператор в C#, но в какой-то момент они могли бы добавить другой, в который точка " ternary" будет неоднозначно, но " conditional" won' t. – Jon Skeet 18.05.2020, 21:27

?? там для обеспечения значения для nullable типа, когда значение является пустым. Так, если formsAuth будет пустым, он возвратит новый FormsAuthenticationWrapper ().

20
ответ дан 18.05.2020, 21:26

Спасибо все, вот самое сжатое объяснение, которое я нашел на сайте MSDN:

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
26
ответ дан 18.05.2020, 21:27
  • 1
    Мне действительно жаль, что это действительно не работало как это. Я хочу сделать это все время, но меня can' t, потому что переменный I' m использующий isn' t nullable тип. Работы в coffeescript y = x?-1 – PandaWood 18.05.2020, 21:27
  • 2
    @vitule не, если второй операнд пустого оператора объединения является не допускающим NULL-значения, то результат является не допускающим NULL-значения (и -1 просто плоскость int, который является не допускающим NULL-значения). – Georges Dupéron 18.05.2020, 21:27
  • 3
    Я думаю, что фрагмент кода должен читать: интервал? y = x??-1; – vitule 18.05.2020, 21:28
  • 4
    Это намекает на важный аспект?? оператор - это было представлено для помощи в работе с nullable типами. В Вашем примере, " x" имеет тип " интервал? " (Nullable< int>). – Drew Noakes 18.05.2020, 21:28

Это - пустой оператор объединения.

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

Да, почти невозможный искать, если Вы не знаете то, чем это называют!:-)

РЕДАКТИРОВАНИЕ: И это - замечательная функция от другого вопроса. Можно объединить их в цепочку.

Скрытые Функции C#?

68
ответ дан 18.05.2020, 21:27
  • 1
    По крайней мере, теперь, it' s легкий искать его, даже если Вы don' t знают имя, я просто погуглил " двойной вопросительный знак c#" – stivlo 18.05.2020, 21:28

Для Вашего развлечения только (знающий Вас все парни C#;-).

я думаю, что это произошло в Smalltalk, где это было вокруг много лет. Это определяется там как:

в Объекте:

? anArgument
    ^ self

в UndefinedObject (иначе класс ноля):

? anArgument
    ^ anArgument

Там и оценивают (?) и не оценивают версии (??) из этого.
Это часто находится в методах получателя для лениво инициализированного, частного (экземпляр) переменные, которым оставляют ноль, пока действительно не необходимый.

10
ответ дан 18.05.2020, 21:32
  • 1
    походит на переносящийся ViewState со свойством на UserControl. Инициализируйте только на первом, добираются, если it´ s не набор прежде. =) – Seiti 18.05.2020, 21:32

Просто, потому что никто еще еще не сказал волшебные слова: это пустой оператор объединения. Это определяется в разделе 7.12 из спецификация языка .

C# 3.0, Это очень удобно, особенно из-за способа, которым это работает, когда это используется многократно в выражении. Выражение формы:

a ?? b ?? c ?? d

даст результат выражения a, если это будет непустым, иначе попробуйте b, иначе попробуйте c, иначе попробуйте d. Это закорачивает в каждой точке.

кроме того, если тип d является не допускающим NULL-значения, тип целого выражения является не допускающим NULL-значения также.

268
ответ дан 18.05.2020, 21:35

Теги

Похожие вопросы