Что "??" оператор для?
Мне было интересно ??
знаки в 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
Это оператор объединения он вернет другое значение, если первое значение равно нулю
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. Прочитайте это для деталей.
Это оператор слияния. Используется с обнуляемыми типами (помимо прочего, извините:)