vb.net - 捕获NullReferenceException或首先测试Nothing?

标签 vb.net nullreferenceexception

我们有一个属性,其工作是查找描述。如果查找失败,则应显示一个空字符串。

因此,我们可以像下面这样编码属性:

If foo.bar Is Not Nothing Then
  Return foo.bar.Description
Else
  Return String.Empty
End If

但这涉及两次执行foo.bar,如果这样做很昂贵,那么可能会像这样更好:
Dim b As bar = foo.bar
If b IsNot Nothing Then
  Return b.Description
Else
  Return String.Empty
End If

但是实际上我们要做的就是将任何类型的错误都视为一个空的描述。因此,从某些方面来说,这更简单:
Try
  Return foo.bar.Description
Catch e As NullReferenceException
  Return String.Empty
End Try

但是,仅捕获并忽略该错误是否有任何问题(性能,纯度或其他?)?

您有时会读到抛出异常的代价很高,但是我不确定作者是否意味着使用Throw关键字构建异常的代价很高(我没有这样做),或者他是否意味着允许发生异常的代价很高(就像我会的那样)在做)。

最佳答案

如果肯定要测试Nothing而不是在这里依赖异常。您的代码表明foo.barNothing的方案是预期的方案,而不是异常(exception)的方案。这样的答案。

抛出异常是一个相对昂贵的操作(从性能角度来看)。无论是在代码中扔掉它还是在库代码中扔掉,都是这种情况。这是完全相同的操作。但是,除非有真实,可衡量的关键业务案例,否则我不会出于性能原因而抛出异常。

我认为这主要是出于意图的考虑。通过测试Nothing并对其进行适当的处​​理,您的代码表示以下事实:这不是一件奇怪的事情。

如果您担心两次执行foo.bar的性能,那么要做的第一件事就是找出是否确实如此。如果是这样,可能有解决的方法(您的代码示例已经包含建议)。

关于vb.net - 捕获NullReferenceException或首先测试Nothing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164034/

相关文章:

c# - 取消数据库中的上次更新

vb.net - 如何知道剪贴板上的数据已经可以使用了?

c# - 检查点是否可见时出现 NullreferenceException

c# - 列表框选择事件错误

mysql - 外键存在,我得到 MySQL 错误 : 1452: Cannot add or update a child row: a foreign key constraint fails

mysql - 更新 MySQL 数据库时出错 : DUPLICATE DEFAULT ENTRY FOR PRIMARY KEY = '0'

vb.net - 从 ListView 中删除项目

asp.net - Response.Cookies ["MyCookie"].Value 警告空引用异常

sharepoint - 打开 SharePoint 文档库时出现 NullreferenceException

asp.net - Linq,如何检查字段的值是否为空