Что предпочтительнее: новый Nullable <int>или (int?) Null? - PullRequest
12 голосов
/ 29 апреля 2010

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

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

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

Ответы [ 5 ]

23 голосов
/ 29 апреля 2010

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

5 голосов
/ 29 апреля 2010

Неважно, он генерирует точно такой же код . (int?)null переводится компилятором C # в new Nullable<int>(). Вы можете убедиться в этом сами, написав небольшую тестовую программу и взглянув на нее с помощью ildasm.exe

Так что «лучше» - это просто стиль, который вы предпочитаете. Последовательное использование int? будет моим личным предпочтением.

Одно практическое замечание: в типичном сеансе отладки вам может быть интересно узнать, возвращается ли значение null. Тем более что данные, которые вы читаете, не дают того, что вы ожидаете. Это станет очень легко, если вы напишите нуль-возвращающий оператор в отдельной строке:

   int i;
   if (Int32.TryParse(Request["id"], out i)) return i;
   else return null;       // <== set breakpoint here.

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

5 голосов
/ 29 апреля 2010

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

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

2 голосов
/ 29 апреля 2010

Делай все, что тебе хочется.

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

1 голос
/ 29 апреля 2010

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

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

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

...