VB.NET - IsNothing与什么都没有

Luk*_*vin 128 vb.net nothing

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

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

lom*_*axx 123

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

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


小智 45

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

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

编辑 - VoteCoffe的评论在这里

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

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

Kyl*_*Mit 33

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

以下是文章IsNothing()VS Is Nothing的 4个理由

  1. 最重要的是,IsNothing(object)将所有内容作为对象传递给它,甚至是值类型!由于价值类型不可能Nothing,这是一个完全浪费的检查.
    请看以下示例:

    Dim i As Integer
    If IsNothing(i) Then
       ' Do something 
    End If
    
    Run Code Online (Sandbox Code Playgroud)

    这将编译并运行正常,而这:

    Dim i As Integer
    If i Is Nothing Then
        '   Do something 
    End If
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

    所以我认为If a IsNot Nothing阅读比...更好If Not IsNothing(a)


pro*_*dad 29

我同意"没什么".如上所述,很容易否定"IsNot Nothing".

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

If printDialog IsNot Nothing Then
    'blah
End If
Run Code Online (Sandbox Code Playgroud)

比这个...

If Not obj Is Nothing Then
    'blah
End If
Run Code Online (Sandbox Code Playgroud)


Ada*_*ile 5

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

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

  • 你的链接已经死了,所以它的价值在于它的实时价值:http://web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/08/vb_adds_aint_ke.html值得注意的是与流行的看法相反,这不是真的. (3认同)

dea*_*ime 5

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

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