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

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

===============>>#1 票数:121 已采纳

如果你看一下正在执行的MSIL,你会发现它没有编译成完全相同的代码。 当您使用IsNothing()时,它实际上调用该方法而不是仅仅计算表达式。

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

===============>>#2 票数:43

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

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

编辑 - VoteCoffe的评论在这里

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

===============>>#3 票数:33

你绝对应该避免使用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 

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

    'is'运算符不接受'Integer'类型的操作数。
    操作数必须是引用或可空类型。

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

  3. 它的速度很慢 - 实际上慢了33.76%(超过10亿次迭代)!

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

    做x? --- 不是 x属于的属性吗?

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

===============>>#4 票数:29

我同意“没什么”。 如上所述,很容易否定“IsNot Nothing”。

我发现这更容易阅读......

If printDialog IsNot Nothing Then
    'blah
End If

比这个...

If Not obj Is Nothing Then
    'blah
End If

===============>>#5 票数:5

VB充满了各种各样的东西,试图使它既“像英语一样”,也适合那些习惯使用()和{}的语言的人。 例如,在“喜欢英语”方面... VB有“ 不是 ”关键字......不,我不是在开玩笑。 而另一方面,正如您可能已经知道的那样,大多数情况下,如果您愿意,可以使用()函数调用,但不必。

我更喜欢IsNothing()......但是我使用的是C和C#,所以这才是舒适的。 而且我认为它更具可读性。 但是,对你来说,感觉更舒服。

===============>>#6 票数:5

我倾向于“没什么”替代品,主要是因为它看起来更像OO。

当然Visual Basic 没有得到Is Not关键字。

===============>>#7 票数:2

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

===============>>#8 票数:1

我最初使用的是IsNothing,但我一直在使用Is Nothing进行更新的项目,主要是为了提高可读性。 我坚持使用IsNothing的唯一一次是,如果我维护的代码在整个过程中使用,我希望保持一致。

===============>>#9 票数:-2

Nothing是否需要已赋值为Nothing的对象。 IsNothing()可以接受任何尚未初始化的变量,包括数字类型。 例如,在测试是否已传递可选参数时,这很有用。

  ask by Luke Girvin translate from so

未解决问题?本站智能推荐: