Ответ 1
Лучше всего default(int?)
, потому что он всегда работает как ожидалось (типы ссылок, типы значений и даже в дженериках).
Какой способ является предпочтительным в таких выражениях:
int? Id
{
get
{
int i;
return Int32.TryParse(Request["id"], out i) ? i : (int?)null;
}
}
лучше ли нарисовать на null
или создать new Nullable<T>
?
Лучше всего default(int?)
, потому что он всегда работает как ожидалось (типы ссылок, типы значений и даже в дженериках).
Я предпочитаю обозначать (int?)
до Nullable<int>
. Язык предоставляет этот синтаксический сахар, поэтому я пытаюсь его использовать.
Вот почему я называю это int
вместо Int32
.
Не имеет значения, он генерирует точный код. (int?)null
преобразуется компилятором С# в new Nullable<int>()
. Вы можете это увидеть сами, написав небольшую тестовую программу и глядя на нее с помощью ildasm.exe
Итак, "лучше" - это просто тот стиль, который вы предпочитаете. Последовательное использование int? было бы моим личным предпочтением.
Одно практическое замечание: в типичном отладочном сеансе вам может быть интересно узнать, возвращается ли null. Тем более, что прочитанные вами данные не дают ожидаемого результата. Это становится очень легко, если вы напишете оператор null-return в отдельной строке:
int i;
if (Int32.TryParse(Request["id"], out i)) return i;
else return null; // <== set breakpoint here.
Избавиться от броска тоже. И выдает точный код
Сделайте для себя все, что вам лучше.
Я сказал, что предпочитаю просто возвращать null
, а компилятор детализирует детали.
Интересно, что вам нужно только определить один из типов возврата. Другими словами, это также будет работать:
return Int32.TryParse(Request["id"], out i) ? (int?)i : null;
... хотя компилятор предлагает вам указать значение null: Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'int' и '<null> '