关于vb.net:IsNothing vs Nothing

关于vb.net:IsNothing vs Nothing

IsNothing versus Is Nothing

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

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


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

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


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

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

编辑-VoteCoffe的评论在这里

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


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

这是文章IsNothing()VS Nothing的4个原因

  • 最重要的是,IsNothing(object)将所有内容作为对象传递给它,甚至值类型也是如此!由于值类型不能为Nothing,因此完全浪费了检查。
    请看以下示例:

    1
    2
    3
    4
    Dim i As Integer
    If IsNothing(i) Then
       ' Do something
    End If

    这样可以编译运行,但是:

    1
    2
    3
    4
    Dim i As Integer
    If i Is Nothing Then
        '   Do something
    End If

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

    'Is' operator does not accept operands of type 'Integer'.
    Operands must be reference or nullable types.

  • IsNothing(object)实际上是Microsoft.VisualBasic.dll部分的一部分。
    这是不希望有的,因为您不需要依赖VisualBasic库。

  • 它的速度慢-实际上慢了33.76%(超过1000000000次迭代)!

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

    即它做x吗? ---不是x是它的属性吗?

    所以我认为If a IsNot Nothing的阅读效果优于If Not IsNothing(a)


  • 我同意"什么都不是"。如上所述,很容易否定"不算什么"。

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

    1
    2
    3
    If printDialog IsNot Nothing Then
        'blah
    End If

    比这个...

    1
    2
    3
    If Not obj Is Nothing Then
        'blah
    End If

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

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


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

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


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


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


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


    推荐阅读