虚无与虚无


130

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

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


3
很多避免使用的充分理由IsNothing()
KyleMit 2014年

@JesseChisholm,一个评论太多了,但是我以前的评论将此链接发布到了一篇文章,其中列举了5个不同的博客。blog.reneorban.com
2011/12/

技术答案确实很有趣,但可耻的是,这个问题有点太开放了,没有产生任何答案,只是个人喜好越来越模糊
underscore_d

Answers:


125

如果在执行MSIL的过程中对其进行观察,您会发现它并没有编译成完全相同的代码。当您使用IsNothing()时,它实际上是对该方法进行调用,而不是仅仅对表达式求值。

我倾向于使用“什么都不是”的原因是,当我否定它时,它变成了“我不是什么”而不是我个人觉得更易读的“不是不是(对象)”。


46

我发现帕特里克·斯蒂尔在他的博客上回答了这个问题最好:避免IsNothing()

为了确保帕特里克·斯蒂尔(Patrick Steele)的职位受到赞誉,我没有在此处复制他的任何答案。但是我确实认为,如果您要尝试确定是否使用“无”或“无”,则应阅读他的文章。我认为您会同意“无为”是最佳选择。

编辑-VoteCoffe的评论在这里

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


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

7
张贴一些内容,因为您永远不知道链接是否会消失,我认为这对本主题很有帮助。
VoteCoffee,2014年

33

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

这是文章IsNothing()VS 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%(超过1000000000次迭代)!

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

    做x吗?--- 不要x荷兰国际集团的性质

    所以我认为If a IsNot Nothing读起来比If Not IsNothing(a)


29

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

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

If printDialog IsNot Nothing Then
    'blah
End If

比这个...

If Not obj Is Nothing Then
    'blah
End If

5

VB充满了这样的事情,试图使它既“像英语”又让习惯于经常使用()和{}的语言的人感到满意。例如,在“ like english”方面,VB的关键词Ai n't ”……不,我不是在开玩笑。另一方面,您可能已经知道大多数时间都可以将()与函数调用结合使用,但是不必这样做。

我更喜欢IsNothing()...但是我使用C和C#,所以这很舒服。而且我认为它更具可读性。但是,无论您觉得哪种感觉都更舒适。


3
您的链接已死,因此对于这里的价值来说,它是实时的:web.archive.org/web/20050308014055/http : //ea.3leaf.com/2004/08/…值得一提的是,与流行的看法相反不对。
马特·威尔科

5

我倾向于“一无所有”替代方案,主要是因为它看起来更面向对象。

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


VB.NET可以使用扩展方法吗?:)
klkitchens


1

我最初使用IsNothing,但是我一直在较新的项目中使用Is Nothing,主要是为了提高可读性。我唯一坚持使用IsNothing的方法是,如果我要维护始终使用的代码,并且希望保持一致。


-2

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


错了 您确定您没有弄错方法吗?IsNothing适用于引用类型。如果您分配Nothing [...] IsNothing始终返回False,则值类型不能保存Nothing的值并恢复为其默认值。但是,“代表任何数据类型的默认值。对于值类型,[this]取决于值类型是否可为空。” 那不是更好吗?Nothing Is Nothing
underscore_d
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.