哪个更好:新的Nullable<int>还是(int?)null?

14

在像这样的表达式中,哪种方式更受推荐:

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

null 强制转换还是创建一个 new Nullable<T> 更好?

5个回答

25

最好的选择是 default(int?),因为它始终按预期工作(包括引用类型、值类型,甚至泛型)。


以前没见过这个,我喜欢它!我一直使用(int?)null,但总觉得很笨重。 - Daniel Renshaw

5

不要紧,它生成的完全相同的代码(int?)null被C#编译器翻译为new Nullable<int>()。您可以通过编写一个小测试程序并使用ildasm.exe查看它来自行验证。

因此,“更好”只是你喜欢的风格。一致使用int?将是我个人的首选。

一个实用的提示:在典型的调试会话中,您可能很想知道返回了null。特别是当您读取的数据没有产生您期望的结果时。如果您将返回null的语句写在单独的一行上,这将变得非常容易:

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

去掉了强制类型转换,并生成完全相同的代码

5

我倾向于使用 (int?) 表示可空整型,而不是使用 Nullable<int>。编程语言提供了这种语法糖,所以我尽量使用它。

这也是为什么我称其为 int 而不是 Int32


2

按照你自己最清晰的方式去做。

话虽如此,我更喜欢只返回null,并让编译器解决细节问题。


1
有趣的是,您只需要定义其中一种返回类型。换句话说,这也可以工作:
  return Int32.TryParse(Request["id"], out i) ? (int?)i : null;

尽管编译器建议您必须转换空值:

条件表达式的类型无法确定,因为'int'和'<null>'之间没有隐式转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接