Мне было интересно узнать знаки ??
в коде C#
. Для чего это? И как я могу его использовать?
Как насчет int?
? Является ли это nullable int?
Мне было интересно узнать знаки ??
в коде C#
. Для чего это? И как я могу его использовать?
Как насчет int?
? Является ли это nullable int?
Он называется "нулевым коалесцирующим оператором" и работает примерно так:
Вместо этого:
int? number = null;
int result = number == null ? 0 : number;
Теперь вы можете просто сделать:
int result = number ?? 0;
Это оператор null коалесценции. Он был введен в С# 2.
Результат выражения a ?? b
равен a
, если это не null, или 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.
оператор возвращает левый операнд, если он не равен NULL, или возвращает верный операнд.
Вы можете прочитать об этом здесь: http://msdn.microsoft.com/en-us/library/ms173224(VS.80).aspx
Это ярлык для:
Text = (category == null ? "Home" : category);
это оператор коалесценции. он вернет другое значение, если первое значение равно null
string value1 = null;
string value2 = "other";
string value3 = value1 ?? value2; // assigns "other" to value 3
он проверяет, является ли категория нулевым - в этом случае нулевое значение заменяется на "Главная".
Одно из моих любимых применений для оператора нулевой коалесценции - это избегать операторов в моем коде (я думаю, что если утверждения уродливы и просто загромождают вещи в большинстве случаев). Например, возьмите типичный сценарий, в котором можно было бы загрузить что-то из кеша, если оно доступно, в противном случае загрузите из db и заполните кеш.
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. Функции выполняют ровно одну четко идентифицируемую функцию.
если категория равна null, текст станет "Главная"
Int? является нулевым int, что означает, что он может иметь значения нормального int и null. Подробнее читайте этот.
Возвращает первое непустое значение. Handy.
Это оператор с нулевой связью. Он использует типы с нулевым значением (среди прочего, извините:)