Подтвердить что ты не робот

Что является предпочтительным: новый Nullable <int> или (int?) Null?

Какой способ является предпочтительным в таких выражениях:

int? Id
{
   get
   {
      int i;
      return Int32.TryParse(Request["id"], out i) ? i : (int?)null;
   }
}

лучше ли нарисовать на null или создать new Nullable<T>?

4b9b3361

Ответ 1

Лучше всего default(int?), потому что он всегда работает как ожидалось (типы ссылок, типы значений и даже в дженериках).

Ответ 2

Я предпочитаю обозначать (int?) до Nullable<int>. Язык предоставляет этот синтаксический сахар, поэтому я пытаюсь его использовать.

Вот почему я называю это int вместо Int32.

Ответ 3

Не имеет значения, он генерирует точный код. (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.

Избавиться от броска тоже. И выдает точный код

Ответ 4

Сделайте для себя все, что вам лучше.

Я сказал, что предпочитаю просто возвращать null, а компилятор детализирует детали.

Ответ 5

Интересно, что вам нужно только определить один из типов возврата. Другими словами, это также будет работать:

  return Int32.TryParse(Request["id"], out i) ? (int?)i : null;

... хотя компилятор предлагает вам указать значение null: Тип условного выражения не может быть определен, потому что нет никакого неявного преобразования между 'int' и '<null> '