【问题标题】:Casting (int?)null vs. new int?() - Which is better?铸造 (int?)null 与 new int?() - 哪个更好?
【发布时间】:2010-02-11 18:05:00
【问题描述】:

当我需要将值加载到类和结构中时,我经常使用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?() 更快地解决编译器。

干杯!

【问题讨论】:

    标签: c# performance nullable


    【解决方案1】:

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

    当您谈论“让编译器更快地解决”问题时,您是在谈论微优化您的构建时间吗?我不知道那里会更快,但我怀疑它是否会对任何重要的代码体产生可靠可测量的差异。

    我个人会使用null,只要我可以毫不含糊地这样做;我想我仍然更喜欢演员而不是打电话给new,但这并没有真正的区别。

    【讨论】:

    • 我同意你的看法。 (int?)null 看起来比 new int?() 好得多,尤其是在我的示例所示的内联条件语句中使用时。关于您的问题:当您说 IL 相同时,您回答了它。构建时间目前不是问题(除非我使用 TFSBuild,但这是一个完全不同的故事)所以只要 IL 匹配,我很高兴 :)
    • 我最喜欢的(演员版本紧随其后)是default(int?)
    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多