有默认格式String.IsNullOrEmpty(str)而不是str.IsNullOrEmpty()有什么意义吗?

时间:2015-08-15 10:41:34

标签: vb.net string nothing

.NET库有String.IsNullOrEmpty(value As String)

我可以通过简单的扩展方法创建更舒适的<stringValue>.IsNullOrEmpty()

<Extension>
Function IsNullOrEmpty(s As String) As Boolean
    Return String.IsNullOrEmpty(s)
End Function

我的第一个快速理解是,这不是开箱即用的,因为它可以在NullReferenceException的情况下抛出null。直到我发现这不是真的,因为String变量中的Nothing被输入为字符串。

Dim s As String = Nothing
If s.IsNullOrEmpty() Then ... 'this will always return true, no exception thrown

是否有默认表单String.IsNullOrEmpty(s)而不是s.IsNullOrEmpty()我错过了哪些内容?

当然,在立即窗口中我无法输入

? Nothing.IsNullOrEmpty()

但无论如何这都是无稽之谈。这通常有效:

? CStr(Nothing).IsNullOrEmpty()

3 个答案:

答案 0 :(得分:4)

默认值是String中的静态方法而不是普通方法的原因是因为在Nothing / null上调用方法会导致异常。所以你必须首先检查Nothing / null然后没有必要调用另一个方法来检查它是否可能是Nothing / null。

你的扩展方法不会导致这种情况的原因是因为它是一个将对象作为参数获取的方法,就像String中的静态方法一样。

但如果你的意思是为什么没有完成扩展方法,那么Damien_The_Unbeliever的答案是正确的:没有扩展方法可以开始。并且复制一个副本可能在以后没有意义。

答案 1 :(得分:3)

它没有被实现为扩展方法(在一天结束时,仍然只是一个静态方法)的原因是历史性的 - 扩展方法直到C#3 / VB才存在9 - 在.NET 1.0中String.IsNullOrEmpty首次亮相后半年多。

当第一个参数为NullReferenceException时,不会抛出null的扩展方法实际上非常令人困惑 - 因为这样可以提供与普通实例方法不同的行为。

当手动抛出异常时,它们会引起足够的混淆,而是将其作为ArgumentNullException抛出,或者只是从实现中的深层传播(与抛出NullReferenceException的普通实例方法不同通话网站)。

答案 2 :(得分:1)

毕竟,添加我自己的答案“For Dummies”,也许它可以帮助某人:

无法在null上调用标准类方法,即使该null是字符串(CStr(Nothing))也是如此。因此,如果stringValue.IsNullOrEmpty()为空,那么简单地让stringValue不能用作标准方法。

它仅适用于扩展方法,因为它是静态方法,实际上接受该对象作为其第一个参数。那里没有问题。但它会让人感到困惑,因为由于标准方法的行为,没有人会期望在null对象上调用方法 - 这不常见,它看起来很像未修复的bug,尽管它不是。这种混乱将迫在眉睫,特别是在IDE外部读取源代码时 - 扩展方法无法与标准方法明确区分。

因此,我们可以完全放弃使用可以在null上调用的扩展方法,或者在名称中明确区分扩展方法。后一种做法也可以帮助其他加入该项目的人提高他们对任何与项目相关的扩展方法的认识:“标准类附带了一些内容”。这种做法还可以防止发现stringValue.IsNull()时的混淆,这通常是无稽之谈。有很多方法可以写出与众不同的名字,但我认为最好的方法只是增加独特的性格,这样名字就可以保持简短而且不受其他词语的影响。

这是我的想法:在美国之外,我们更习惯于非ASCII字符,有一些有趣的字母表,如this。其中一个独特的字符可以适合作为字形添加到名称中,从而创建例如stringValue.IsNullOrEmptyᛎ(),它也对应于扩展方法的常用徽章图形。