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

Is there any point in having default form String.IsNullOrEmpty(str) instead of str.IsNullOrEmpty()?

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

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

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

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

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

使用默认格式 String.IsNullOrEmpty(s) 代替我缺少的 s.IsNullOrEmpty() 是否有意义?

当然,在即时 Window 我不能输入

? Nothing.IsNullOrEmpty()

但无论如何都是废话。这正常工作:

? CStr(Nothing).IsNullOrEmpty()

之所以默认是String中的静态方法而不是普通方法,是因为调用Nothing/null上的方法会引发异常。因此,您必须先检查 Nothing/null,然后再调用另一个方法来检查它是否可能是 Nothing/null 就没有意义了。

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

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

它没有作为扩展方法(归根结底仍然只是静态方法)实现的原因是历史性的——扩展方法直到 C# 3 / VB 9 - String.IsNullOrEmpty 在 .NET 1.0 中首次亮相后五年多。

当第一个参数为 null 时不抛出 NullReferenceException 的扩展方法实际上很难推理 - 因为这给了它们不同于普通实例方法的行为。

当异常被手动抛出,抛出而不是作为 ArgumentNullException,或者只是从实现内部传播(不同于抛出 NullReferenceException 的普通实例方法时,它们已经足够混乱了调用站点)。

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

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

它仅适用于 扩展方法,因为它是实际上接受对象作为其第一个参数的静态方法。那里有 null 没问题。但这会让人感到困惑,因为由于标准方法的行为,没有人会期望在空对象上调用方法——这不是常见的事情,它看起来更像是未修复的错误,尽管它不是。这种混淆迫在眉睫,尤其是在阅读 IDE 之外的源代码时——扩展方法无法与标准方法清楚地区分。

所以我们要么完全放弃使用可以在 null 上调用的扩展方法,要么在扩展方法的名称中明确区分它们。后一种做法还可以帮助加入该项目的其他人提高他们对 任何与项目相关的 扩展方法的认识:"there is something attached to standard class"。这种做法还可以防止在发现 stringValue.IsNull() 时出现混淆,这通常是无稽之谈。有区别的名字的写法有很多种,但我认为最好的是只加有区别的字符,这样名字就可以保持简短并且不受额外单词的影响。

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