繁体   English   中英

IsNothing 与 Is Nothing

[英]IsNothing versus Is Nothing

这里有没有人使用 VB.NET 并且强烈偏好或反对使用IsNothing而不是Is Nothing (例如, If IsNothing(anObject)If anObject Is Nothing... )? 如果是这样,为什么?

编辑:如果您认为它们都同样可以接受,您认为最好选择一个并坚持使用,还是可以混合使用?

如果您查看正在执行的 MSIL,您会发现它不会编译为完全相同的代码。 当您使用 IsNothing() 时,它实际上会调用该方法,而不仅仅是评估表达式。

我倾向于使用“Is Nothing”的原因是,当我否定它时,它会变成“IsNot Nothing”而不是“Not IsNothing(object)”,我个人认为这看起来更具可读性。

我发现Patrick Steele在他的博客上回答了这个问题最好的: Avoiding IsNothing()

我没有在这里复制他的任何回答,以确保帕特里克斯蒂尔的帖子得到认可。 但我确实认为,如果你想决定是使用 Is Nothing 还是 IsNothing,你应该阅读他的帖子。 我想你会同意 Is Nothing 是最好的选择。

编辑 - VoteCoffe 的评论在这里

部分文章内容:在查看更多代码后,我发现了另一个应该避免这种情况的原因:它接受值类型! 显然,由于 IsNothing() 是一个接受“对象”的函数,因此您可以将任何您想要的传递给它。 如果它是一个值类型,.NET 会将它装箱成一个对象并将它传递给 IsNothing——它总是在装箱的值上返回 false! VB.NET 编译器将检查“Is Nothing”样式语法,如果您尝试对值类型执行“Is Nothing”,则不会编译。 但是 IsNothing() 函数编译时没有抱怨。 -PSteele – VoteCoffee

你应该绝对避免使用IsNothing()

以下是文章IsNothing() VS Is Nothing中的4 个原因

  1. 最重要的是, IsNothing(object)将所有东西都作为对象传递给它,甚至是值类型! 由于值类型不能为Nothing ,因此完全浪费检查。
    以下面的例子为例:

     Dim i As Integer If IsNothing(i) Then ' Do something End If

    这将编译并运行良好,而这:

     Dim i As Integer If i Is Nothing Then ' Do something End If

    不会编译,而是编译器会引发错误:

    “是”运算符不接受“整数”类型的操作数。
    操作数必须是引用或可为空的类型。

  2. IsNothing(object)实际上是Microsoft.VisualBasic.dll的一部分。
    这是不可取的,因为您对 VisualBasic 库有不必要的依赖。

  3. 它很慢——实际上慢了 33.76%(超过 1000000000 次迭代)!

  4. 也许是个人喜好,但IsNothing()读起来像Yoda Condition 当您查看一个变量时,您正在检查它的状态,并将其作为您调查的主题。

    做 x 吗? ---不是x ing 是它的一个属性吗?

    所以我认为If a IsNot NothingIf Not IsNothing(a)读起来更好

我同意“什么都不是”。 如上所述,很容易用“IsNot Nothing”来否定。

我觉得这更容易阅读......

If printDialog IsNot Nothing Then
    'blah
End If

比这个...

If Not obj Is Nothing Then
    'blah
End If

VB 充满了类似的东西,试图使它既“像英语一样”,又让习惯使用 () 和 {} 的语言的人感到舒服。 另一方面,正如您可能已经知道的那样,大多数情况下,如果您愿意,您可以将 () 与函数调用一起使用,但不是必须的。

我更喜欢 IsNothing()...但我使用 C 和 C#,所以这很舒服。 而且我认为它更具可读性。 但是选择你觉得更舒服的任何东西。

我倾向于“什么都不是”的选择,主要是因为它看起来更面向对象。

当然,Visual Basic 没有Ain't 关键字。

我也倾向于使用Is Nothing版本部分地使用它,就像我在SQL中一样。

我最初使用 IsNothing,但我一直在转向在较新的项目中使用 Is Nothing,主要是为了可读性。 我唯一坚持使用 IsNothing 的情况是,如果我要维护在整个过程中使用的代码并且我想保持一致。

Is Nothing 需要一个已分配给 Nothing 值的对象。 IsNothing() 可以采用任何尚未初始化的变量,包括数字类型。 例如,在测试是否传递了可选参数时,这很有用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM