VB.NET - 没有什么比没有

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

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

0
有充分理由的 避免使用 IsNothing()
额外 作者 KyleMit,
@JesseChisholm,对于一个评论来说太多了,但是我之前的评论发布了这个链接到一篇文章,其中列举了5个不同的文章 blog.reneorban.com/2011/12/vbnet-isnothing-vs-is-nothing.htm‌ l
额外 作者 KyleMit,
技术答案真的很有趣,但遗憾的是这个问题留下了太多的空白,并产生了一些没用的答案,只是个人偏好越来越模糊
额外 作者 underscore_d,

9 答案

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

我更喜欢IsNothing()...但我使用C和C#,所以这就是舒适的。我认为它更具可读性。但要随心所欲地去做任何感觉。

0
额外
你的链接已经死了,所以它的价值在这里是一个活的: web.archive.org/web/20050308014055/http://ea.3leaf.com/2004/‌ 08 /… 值得注意的是,与流行的观点相反这不是真的。
额外 作者 Matt Wilko,

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

我倾向于倾向于使用“不是什么”的原因是,当我否定它成为“不是什么”而不是“不是没有(对象)”时,我个人觉得它看起来更具可读性。

0
额外

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

0
额外

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

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

If printDialog IsNot Nothing Then
    'blah
End If

比这个...

If Not obj Is Nothing Then
    'blah
End If
0
额外

我倾向于“无所谓”的选择,主要是因为它看起来更OO。

Surely Visual Basic ain't got the Ain't keyword.

0
额外
VB.NET可以做扩展方法吗? :)
额外 作者 klkitchens,

You should absolutely avoid using IsNothing()

Here are 4 reasons from the article IsNothing() VS Is Nothing

  1. Most importantly, IsNothing(object) has everything passed to it as an object, even value types! Since value types cannot be Nothing, it?s a completely wasted check.
    Take the following example:

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

    This will compile and run fine, whereas this:

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

    Will not compile, instead the compiler will raise the error:

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

  2. IsNothing(object) is actually part of part of the Microsoft.VisualBasic.dll.
    This is undesirable as you have an unneeded dependency on the VisualBasic library.

  3. Its slow - 33.76% slower in fact (over 1000000000 iterations)!

  4. Perhaps personal preference, but IsNothing() reads like a Yoda Condition. When you look at a variable you're checking it's state, with it as the subject of your investigation.

    i.e. does it do x? --- NOT Is xing a property of it?

    So I think If a IsNot Nothing reads better than If Not IsNothing(a)

0
额外

我最初使用的是IsNothing,但我一直在朝着更新的项目使用Is Nothing,主要是为了可读性。我坚持使用IsNothing的唯一时间就是如果我维护那些始终使用的代码并且我想保持一致。

0
额外

I find that Patrick Steele answered this question best on his blog: Avoiding IsNothing()

我没有在这里复制他的任何答案,以确保帕特里克斯蒂尔得到他的职位的荣誉。但我确实认为,如果你试图决定是否使用“无”或“无”,你应该阅读他的文章。我认为你会同意没有什么是最好的选择。

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

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

0
额外
这是错误的。你确定你没有把它弄错吗? IsNothing 适用于引用类型,如果您指定 Nothing [...],则值类型不能包含 Nothing 的值并返回其默认值。 ] IsNothing 总是返回 False 。“Nothing ”代表任何数据类型的默认值[...]对于值类型,[this ]取决于值类型是否可为空。“所以不是 Is Nothing 更好?
额外 作者 underscore_d,