Что ?? оператор для?

Мне было интересно узнать о знаках ?? в C# коде. Для чего это? И как я могу его использовать?

А что насчет int?? Это int, допускающий значение NULL?

Смотрите также:

?? Оператор Null Coalescing - ›Что означает объединение?


person Ante    schedule 05.05.2009    source источник
comment
Чтобы узнать о множестве других забавных синтаксисов в C #, проверьте это: stackoverflow.com/questions/9033/hidden-features- of-c   -  person tster    schedule 19.11.2009


Ответы (12)


Он называется «нулевым оператором объединения» и работает примерно так:

Вместо того, чтобы делать:

int? number = null;
int result = number == null ? 0 : number;

Теперь вы можете просто сделать:

int result = number ?? 0;
person BFree    schedule 05.05.2009
comment
Собственно х ?? y вызывает x.GetValueOrDefault (y) (код IL: call instance !0 valuetype [mscorlib]System.Nullable1 ‹int32› :: GetValueOrDefault () `) - person Aidiakapi; 08.09.2011

Это нулевой оператор объединения. Он был введен в C # 2.

Результатом выражения a ?? b является a, если это не null, или b в противном случае. b не оценивается, если в этом нет необходимости.

Две приятные вещи:

  • Общий тип выражения - тип второго операнда, что важно, когда вы используете типы значений, допускающие значение NULL:

    int? maybe = ...;
    int definitely = maybe ?? 10;
    

    (Обратите внимание, что вы не можете использовать тип значения, не допускающий значения NULL, в качестве первого операнда - это было бы бессмысленно.)

  • Правила ассоциативности означают, что вы можете очень легко связать это. Например:

    string address = shippingAddress ?? billingAddress ?? contactAddress;
    

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

person Jon Skeet    schedule 19.11.2009
comment
+1 для второго операнда не оценивается, если он не нужен. Подобные вещи легко упустить. - person Konamiman; 19.11.2009
comment
Это должно быть объединено с stackoverflow.com/questions/827454/ что-это-оператор-для его более полный ответ - person Sam Saffron; 19.11.2009
comment
это эквивалентно a! = null? a: b - person dharga; 18.12.2009
comment
@dharga: За исключением того, что он оценивает a только один раз. - person Jon Skeet; 18.12.2009

Это оператор объединения. По сути, это сокращение для следующих

x ?? new Student();
x != null ? x : new Student();

Документация MSDN по оператору

person JaredPar    schedule 05.05.2009

Это новый оператор Null Coalesce.

?? Оператор возвращает левый операнд, если он не равен нулю, или же возвращает правый операнд.

Вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx

person Scott Ferguson    schedule 05.05.2009

Это ярлык для:

Text = (category == null ? "Home" : category);
person Konamiman    schedule 19.11.2009

это оператор объединения. он вернет другое значение, если первое значение равно нулю

string value1 = null;
string value2 = "other";

string value3 = value1 ?? value2; // assigns "other" to value 3
person Darren Kopp    schedule 05.05.2009

он проверяет, является ли категория нулевой - в этом случае нулевое значение заменяется на «Главная».

person tanascius    schedule 19.11.2009

Одно из моих любимых применений оператора объединения с нулевым значением - это избегать операторов if в моем коде (я думаю, что операторы if уродливы и в большинстве случаев просто загромождают вещи). Например, возьмем типичный сценарий, в котором можно выбрать загрузку чего-либо из кеша, если он доступен, в противном случае загрузить из базы данных и заполнить кеш.

private SomeData GetData() {
    var data = HttpRuntime.Cache.Get("key") as SomeData;

    if (data == null) {
        data = DAL.GetData(some parameters...);
        HttpRuntime.Cache.Add("key", data, ....);
    }

    return data;
}

Для меня это уродливый код. Я могу быть немного анальным, но почему бы вместо этого не реорганизовать его под это?

private SomeData GetDataAndCache() {
    var data = DAL.GetData(some parameters...);
    HttpRuntime.Cache.Add("key", data, ....);
    return data;
}

private SomeData GetData() {
    var data = HttpRuntime.Cache.Get("key") as SomeData;
    return data ?? GetDataAndCache();
}

Он более точно соответствует SRP и чище и легче читается, IMO. Каждая функция выполняет ровно одну четко идентифицируемую функцию.

person Chris    schedule 06.05.2009
comment
comment
Интересно, отображает ли компилятор это иначе, чем IF в MSIL. Кто-нибудь знает? - person Jagd; 06.05.2009
comment
Сомневаюсь, но я не потеряю сон из-за незнания. - person Darren Kopp; 06.05.2009
comment
Я не знаю, что операторы if такие уродливые, но назначение только один раз - хорошая парадигма, когда вы можете сделать это, не нарушая естественного потока кода. - person Roboprog; 06.05.2009
comment
Уродливы ли утверждения if, безусловно, субъективно, и я сомневаюсь, что мой способ улучшает производительность. Как я уже сказал, это просто делает код более чистым и понятным, ИМО. - person Chris; 06.05.2009

если категория не указана, текст станет «Домой».

person brysseldorf    schedule 19.11.2009

Возвращает первое ненулевое значение. Удобно.

person marcc    schedule 05.05.2009

?? Оператор нулевого слияния

int? - это тип int, допускающий значение NULL, что означает, что он может иметь значения нормального int и NULL. Подробнее читайте в this.

person Community    schedule 05.05.2009

Это оператор объединения с нулем. Он используется с типами, допускающими значение NULL (среди прочего , Извините :)

person JP Alioto    schedule 05.05.2009