在像这样的表达式中,哪种方式更受推荐:
int? Id
{
get
{
int i;
return Int32.TryParse(Request["id"], out i) ? i : (int?)null;
}
}
把 null
强制转换还是创建一个 new Nullable<T>
更好?
最好的选择是 default(int?)
,因为它始终按预期工作(包括引用类型、值类型,甚至泛型)。
不要紧,它生成的完全相同的代码。 (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.
我倾向于使用 (int?)
表示可空整型,而不是使用 Nullable<int>
。编程语言提供了这种语法糖,所以我尽量使用它。
这也是为什么我称其为 int
而不是 Int32
。
按照你自己最清晰的方式去做。
话虽如此,我更喜欢只返回null
,并让编译器解决细节问题。
return Int32.TryParse(Request["id"], out i) ? (int?)i : null;
尽管编译器建议您必须转换空值:
条件表达式的类型无法确定,因为'int'和'<null>'之间没有隐式转换。