加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

vb.net – Catch NullReferenceException还是先测试Nothing?

发布时间:2020-12-17 00:17:42 所属栏目:大数据 来源:网络整理
导读:我们有一个属性,其工作是查找描述.如果查找失败,则应显示空字符串. 所以我们可以像这样对属性进行编码: If foo.bar Is Not Nothing Then Return foo.bar.DescriptionElse Return String.EmptyEnd If 但这涉及到两次执行foo.bar,如果这样做很昂贵,那么它可能
我们有一个属性,其工作是查找描述.如果查找失败,则应显示空字符串.

所以我们可以像这样对属性进行编码:

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.bar为Nothing的场景是预期的场景,而不是特殊场景.那种方式给出了答案.

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

在我看来,这主要是表达意图的问题;通过测试Nothing并优雅地对其进行操作,您的代码表达了这不会发生奇怪的事实.

如果你担心两次执行foo.bar的性能,首先要做的是找出是否真的如此.如果是这样,可能有解决方法(您的代码示例已包含建议).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读