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

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

Как насчет int?? Это обнуляемый int?

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

?? Нулевой оператор объединения -> Что означает объединение?

12 ответов

Решение

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

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

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

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

int result = number ?? 0;

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

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

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

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

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

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

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

    string address = shippingAddress ?? billingAddress ?? contactAddress;
    

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

Это оператор объединения. Это по сути является сокращением для следующего

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

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

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

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

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

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

Text = (category == null ? "Home" : category);

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

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

string value3 = value1 ?? value2; // assigns "other" to value 3

Он проверяет, имеет ли категория значение NULL - в этом случае значение NULL заменяется на "Home".

Одно из моих любимых применений оператора объединения нулей - избегать операторов 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. Функции выполняют ровно одну четко идентифицируемую функцию.

Если категория пуста, текст станет "домом"

?? Нуль-коалесцирующий оператор

Int? является обнуляемым int, что означает, что он может иметь значения нормальных int и null. Прочитайте это для деталей.

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

Это оператор слияния. Используется с обнуляемыми типами (помимо прочего, извините:)

Другие вопросы по тегам