强制转换 (int?)null 和 new int?() - 哪个更好?

6

当我需要值可为空时,比如从数据库中加载可为空的值(如下面的示例),我经常使用Nullable<T>类型将值加载到类和结构体中。

考虑下面的代码片段:

public class InfoObject
{
    public int? UserID { get; set; }
}

// Load the ID into an SqlInt32
SqlInt32 userID = reader.GetSqlInt32(reader.GetOrdinal("intUserID"));

当我需要将一个值加载到可空属性中时,有时我会这样做:

infoObject.UserID = userID.IsNull ? (int?)null : userID.Value;

有时我会选择这样做:
infoObject.UserID = userID.IsNull ? new int?() : userID.Value;

虽然它们可以达到相同的结果,但我想知道在性能、最小IL代码和最佳实践方面,使用 (int?)nullnew int?() 哪个更好。通常情况下,我更喜欢使用代码中的 new int?() 版本,但我不确定将 (int?)null 强制转换是否比使用 new int?() 更快速地解析。
1个回答

10

它们将生成相同的IL。使用您认为更易于阅读的内容。

当您谈论某物“对编译器解析更快”时,您是否在微调构建时间?我不知道哪一个更快,但我怀疑对于任何重要的代码组,这不会产生可靠的可测量差异。

个人而言,我尽可能使用 null ,如果没有歧义的话;我认为我仍然普遍更喜欢强制转换而不是调用 new,但这并没有真正的区别。


我同意你的看法。(int?)null 看起来比 new int?() 好得多,尤其是在像我示例中所展示的内联条件语句中使用时。关于你的问题:你在回答IL相同时就已经回答了它。构建时间目前不是问题(除非我使用TFSBuild,但那是另一个故事),所以只要IL匹配,我就很高兴 :) - Codesleuth
我的最爱是default(int?)(紧随其后的是带有cast版本)。 - sblom

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