2010-08-07 5 views

ответ

24

Это называется оператором нуль-коалесценции и он действует следующим образом, предположим, что a является обнуляемым INT и b является нормальным ИНТ

b = a ?? 1; 

равно

b = (a != null ? (int)a : 1); 

который равен

if(a != null) 
    b = (int)a; 
else 
    b = 1; 

Поэтому

public NameValueCollection Metadata 
{ 
    get { return metadata ?? (metadata = new NameValueCollection()); } 
} 

развернутом должен выглядеть как-то вроде этого

public NameValueCollection Metadata 
{ 
    get 
    { 
     if(metadata == null) 
      return (metadata = new NameValueCollection()); 
     else 
      return metadata; 
    } 
} 

, который является своего рода шаблон одноплодной один лайнер, потому что возвращается геттерных метаданные (инициализированный объект NameValueCollection) каждый раз, когда он запрашивается, ожидайте, что в первый раз это будет null в этой точке, поэтому он инициализирует его и затем возвращает его. Это не в тему, но обратите внимание, что этот подход к одноэлементному шаблону не является потокобезопасным.

0

Это коалесцирующий оператор, он проверяет наличие нулевого значения.

statement ?? fallback если оператор оценивает null, fallback используется. См. msdn.

-1

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

Читайте об этом здесь: link text

+0

Downvote, потому что без объяснения причин. – problemofficer

4

?? Operator (C# Reference)

?? оператор называется оператором нулевой коалесценции и используется для определения значения по умолчанию для типов нулевых значений , а также типов ссылок . Он возвращает левый операнд , если он не равен NULL; в противном случае он возвращает правый операнд .

Ваш пример может быть переписан как:

public NameValueCollection Metadata 
    { 
    get { 
      if (metadata == null) 
       metadata = new NameValueCollection(); 

      return metadata; 
     } 
    } 
0

The ?? оператор называется оператором с нулевым коалесцированием и используется для определения значения по умолчанию для типов нулевых значений, а также ссылочных типов. Он возвращает левый операнд, если он не равен нулю; в противном случае он возвращает правый операнд.

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

2

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

обнуляемого тип может содержать значение, или оно может быть определено. The ?? оператор определяет значение по умолчанию, которое должно быть возвращено, когда тип с нулевым значением присваивается типу с недействительным значением. Если вы попытаетесь присвоить тип значения с нулевым значением нестандартным типам значений без использования оператора, вы создадите ошибку времени компиляции. Если вы используете бросок, а тип значения с нулевым значением в настоящее время не определен, будет выведено исключение InvalidOperationException.

class NullCoalesce 
{ 
static int? GetNullableInt() 
{ 
    return null; 
} 

static string GetStringValue() 
{ 
    return null; 
} 

static void Main() 
{ 
    // ?? operator example. 
    int? x = null; 

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

    // Assign i to return value of method, unless 
    // return value is null, in which case assign 
    // default value of int to i. 
    int i = GetNullableInt() ?? default(int); 

    string s = GetStringValue(); 
    // ?? also works with reference types. 
    // Display contents of s, unless s is null, 
    // in which case display "Unspecified". 
    Console.WriteLine(s ?? "Unspecified"); 
} 

}

+0

Если вы укажете MSDN, укажите ссылку. – strager

1

Это используется для подстановки значения по умолчанию в случае переменной NULL.

X = (if Y is not null return Y) ?? (else return DEFAULT) 

Читать подробно обсуждение на How useful is C#'s ?? operator?

Смежные вопросы