c# - 在 C# 中访问可空值的最佳方式

标签 c# nhibernate nullable hibernate-criteria

在我们的 C# 代码中,我们已经在尝试访问变量之前测试它是否为 null。

if (myInt.HasValue) {
  var yourInt = myInt;

  // do something with yourInt
}

我的问题:使用 nullable 属性是否有区别,就好像它不是在经过测试之后与以下内容相比?

if (myInt.HasValue) {
  var yourInt = myInt.Value; // see the difference?

  // do something with yourInt
}

这只是一个偏好问题,还是使用 .Value 有明显的原因或性能影响,即使在可为 null 的对象已通过该测试之后也是如此?

更新

我扩展了第二个示例,我们已经使用 HasValue 进行了测试,但是我们使用 .Value 来访问该值。

更新 2

我更新了示例以使用 var,因为在我们的代码中我们实际上并没有使用 int 类型,对于糟糕的示例感到抱歉。在我们的代码中,我们实际上只是在 NHibernate Criteria 查询中使用该对象 - Expression.Eq("thing", myInt) 查询。

这不会引发编译错误。我试图简化示例以在不涉及 NHibernate 的情况下找到问题的根源。抱歉,如果这会使某些答案无效。我只是想看看如果我们强制使用另一种方法来查找值而不是显式调用 .Value 是否会对性能产生影响。

最佳答案

更新:这个问题是 the subject of my blog on December 20th, 2012 .我将在 12 月晚些时候和 2013 年 1 月上旬对此优化进行更多思考。感谢您提出很好的问题!


I was just trying to see if there is a hit on performance if we force another method to find the value versus explicitly calling .Value

首先,如果你有一个性能问题,那么你是唯一可以回答这个问题的人,你可以通过用秒表尝试两种方法来回答这个问题,看看哪一个更快。为什么人们如此频繁地在 StackOverflow 上问这个问题对我来说是个谜。这就像说“嘿互联网,这是两匹马的照片。哪匹跑得更快?”我们怎么知道? 让它们赛跑,然后您就会知道。它们是您的马。

其次,您在一般意义上提出了错误的问题。问题不应该是“性能是否受到影响?”,而是“性能是否受到 Not Acceptable 的影响?”同样,我们不知道您可以接受或不接受什么。

第三,您在非常具体的意义上提出了错误的问题。如果您对纳米级优化感兴趣,正确的问题是使用 Value getter 或 GetValueOrDefault 方法哪个更快?

答案是 GetValueOrDefault 方法通常比 Value 方法快。为什么?因为区别在于:

if (this.HasValue) return this.value; else throw new Exception();

return this.value; 

有什么区别? 抖动可能不会内联前一种方法,因此您要支付最多几纳秒的代价来进行额外的间接调用。

如果几纳秒的惩罚与您相关,那么 (1) 恭喜您编写了一个仅需几微秒即可运行的程序,并且 (2) 您将需要非常仔细地测量看看是否有任何真正的区别,因为纳秒非常小。

关于c# - 在 C# 中访问可空值的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10415722/

相关文章:

c# - P/Invoke 方法与结构使用联合

c# - NHibernate 使用子查询计算另一个实体?

nhibernate - Get<T> 和 Load<T> 的区别

NHibernate:HQL 和 UserTypes 作为查询参数

c# - LINQ:where 子句中的可为 Null 的值类型

objective-c - 使用nonnull时没有警告?

c# - Asp.net 在 GridView.AllowPaging ="true"时生成错误的 SQL 请求

c# - 我在使用托管服务身份对受 AAD 保护的 Azure 应用服务进行身份验证时遇到问题

c# - 如何将 GUID 属性设置为 null

c# - 如何在数据访问层 (C#) 中表示空值