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

В несколько более понятном английском, чем другие (правильные) ответы: git checkout не останавливает файлы, о которых он не знает. Поскольку вы еще не сделали git add в файле file1.html и file2.html, git не знает о них и поэтому не удаляет их при изменении ветвей.

Если вы были add и commit их на ветке моей работы, они уйдут, когда вы проведете мастер, и вернитесь, когда вы посмотрите мои работы.

1477
задан Igor Kustov 3 April 2014 в 11:10
поделиться

9 ответов

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

1992
ответ дан Kolappan Nathan 3 April 2014 в 11:10
поделиться

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

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

FormsAuth = formsAUth == null ? new FormsAuthenticationWrapper() : formsAuth
11
ответ дан Vishal Suthar 3 April 2014 в 11:10
поделиться

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

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

в Объекте:

? anArgument
    ^ self

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

? anArgument
    ^ anArgument

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

10
ответ дан blabla999 3 April 2014 в 11:10
поделиться

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

20
ответ дан Vishal Suthar 3 April 2014 в 11:10
поделиться

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

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

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

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}
11
ответ дан Jon Skeet 3 April 2014 в 11:10
поделиться

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

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
26
ответ дан Edward Tanguay 3 April 2014 в 11:10
поделиться

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

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

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

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

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

68
ответ дан Community 3 April 2014 в 11:10
поделиться

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

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

a ?? b ?? c ?? d

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

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

267
ответ дан Jon Skeet 3 April 2014 в 11:10
поделиться

Если вы знакомы с Ruby, мне кажется, что его || = сродни C # ?? . Вот немного Ruby:

irb(main):001:0> str1 = nil
=> nil
irb(main):002:0> str1 ||= "new value"
=> "new value"
irb(main):003:0> str2 = "old value"
=> "old value"
irb(main):004:0> str2 ||= "another new value"
=> "old value"
irb(main):005:0> str1
=> "new value"
irb(main):006:0> str2
=> "old value"

А в C #:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";
12
ответ дан 22 November 2019 в 20:15
поделиться
Другие вопросы по тегам:

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