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


Пробег через эту строку кода:

FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();

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


1303


источник


Ответы:


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


1783



Просто потому, что никто еще не сказал волшебные слова: это нулевой коалесцирующий оператор , Он определен в разделе 7.12 Спецификация языка C # 3.0 ,

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

a ?? b ?? c ?? d

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

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


231



Это нулевой коалесцирующий оператор.

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

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

EDIT: И это отличная функция из другого вопроса. Вы можете связать их.

Скрытые особенности C #?


63



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

// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;

20



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


16



enter image description here

The two question marks (??) indicate that its a Coalescing operator.

Coalescing operator returns the first NON-NULL value from a chain. You can see this youtube video which demonstrates the whole thing practically.

But let me add more to what the video says.

If you see the English meaning of coalescing it says “consolidate together”. For example below is a simple coalescing code which chains four strings.

So if str1 is null it will try str2, if str2 is null it will try str3 and so on until it finds a string with a non-null value.

string final = str1 ?? str2 ?? str3 ?? str4;

In simple words Coalescing operator returns the first NON-NULL value from a chain.


12



It's short hand for the ternary operator.

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

Or for those who don't do ternary:

if (formsAuth != null)
{
  FormsAuth = formsAuth;
}
else
{
  FormsAuth = new FormsAuthenticationWrapper();
}

9



If you're familiar with Ruby, its ||= seems akin to C#'s ?? to me. Here's some 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"

And in C#:

string str1 = null;
str1 = str1 ?? "new value";
string str2 = "old value";
str2 = str2 ?? "another new value";

9



For your amusement only (knowing you are all C# guys ;-).

I think it originated in Smalltalk, where it has been around for many years. It is defined there as:

in Object:

? anArgument
    ^ self

in UndefinedObject (aka nil's class):

? anArgument
    ^ anArgument

There are both evaluating (?) and non-evaluating versions (??) of this.
It is often found in getter-methods for lazy-initialized private (instance) variables, which are left nil until really needed.


8



Nothing dangerous about this. In fact, it is beautiful. You can add default value if that is desirable, for example:

CODE

int x = x1 ?? x2 ?? x3 ?? x4 ?? 0;

8