【问题标题】:Why String.IsNullOrEmpty(str) and not str.IsNullOrEmpty()?为什么是 String.IsNullOrEmpty(str) 而不是 str.IsNullOrEmpty()?
【发布时间】:2009-12-30 01:50:08
【问题描述】:

有人可以向我解释为什么在.NET 中我会写String.IsNullOrEmpty(str) 而不是str.IsNullOrEmpty()?一定有一个合乎逻辑的原因,但我不知道。

你们好像在说

  1. 您不能从 C#/.NET 中为 null 的对象调用方法(我在 C++ 中这样做,它只是不访问任何成员变量)
  2. .NET 2.0 中不存在扩展方法
  3. 微软没有费心更新标准,可能觉得它微不足道

【问题讨论】:

  • 有趣的旁注:你实际上可以在 Smalltalk 中做到这一点,因为 nil 也是一个对象(它是 UndefinedObject 的单例实例)。
  • 为此目的使用扩展方法是完全错误的,因为它利用了扩展方法的实现细节。您将有效地允许 null.IsNullOrEmpty() 成为法律声明,即使它不是这样编译的。
  • 完全相同的副本:*.com/questions/734372
  • George Stocker:我没有问为什么没有 IsNotNullOrEmpty。我问为什么我不能写“字符串”。IsNotNullOrEmpty

标签: c# .net vb.net string


【解决方案1】:

如果 IsNullOrEmpty 是一个实例方法,则在空实例上调用它会引发 NullReferenceException,而不是像您想要的那样返回 false。

它可能是一个扩展方法,但它可能会令人困惑——它看起来像一个实例方法,但不会像一个实例方法。

【讨论】:

  • 不能是扩展方法;它存在于 C# 3.0 之前。
  • @Jason,我认为他的意思是你可以制作一个扩展方法来处理它。
  • 另外,您不希望IsNullOrEmpty 在收到nullstring 实例时返回true 吗?
  • 记住在 C++ 中的美好时光,在那里您可以执行 bool IsNullOrEmpty(){ if(this == null) return true 等操作。
  • 我认为更正确的答案如下。 IsNullOrEmptyString 类的静态方法。
【解决方案2】:

如果 str 为 null,它将没有任何可访问的方法,因为没有对象的实例。尝试调用空对象上的方法时会出现空引用异常。

String.IsNullOrEmpty 是静态的,因此它始终可用于测试字符串对象。

我猜你可能会争辩说拥有 str.IsEmpty 可能很方便(就像乔纳森所说,你可以为字符串对象创建一个extenion method 来处理这个问题),但实际上调用 String.IsNullOrEmpty 也很容易(str) 并涵盖这两种情况。尽管它们不相同,但大多数人在处理字符串值时将它们等同起来(就业务逻辑而言,并验证字符串是否存在值)。

【讨论】:

    【解决方案3】:

    String.IsNullOrEmpty 是一个类方法。

    如果 str 是 Nothing (Null) 那么你不能调用它的方法。您只能在对象上调用实例方法。

    【讨论】:

    • 顺便提一下,它是实例类的静态方法,而不仅仅是类方法。如果它是一个类方法,那么他发布的内容将是真实的,即:string someobject; someobject.isnullorempty();
    【解决方案4】:

    IsNullOrEmptystring 类的静态方法;它不是实例方法。这是因为如果strnull,那么调用实例方法没有意义,因为您会得到NullReferenceException。因此,IsNullOrEmpty 必须是静态方法。

    【讨论】:

      【解决方案5】:

      我使用扩展方法已经有一段时间了。效果很好。

       public static bool IsNullOrEmpty(this string val)
       {
           return string.IsNullOrEmpty(val);
       }
      

      它显然和 string.IsNullOrEmpty(string) 做同样的事情,但它更容易做类似的事情

      if(mystring.IsNullOrEmpty())
      {
        //... do something
      }
      

      【讨论】:

        【解决方案6】:

        如果可以为静态类型的空引用定义默认行为,那在某些情况下会很好。使用扩展方法,在许多情况下都可以有效地实现这一点。不过,也有一些陷阱。例如,在 .net 语言中通常禁止将对象强制转换为不相关的类型,因为在运行时不存在此类行为合法的情况。另一方面,如果一个对象为空,它可以被强制转换为对象,然后 Object null 可以被强制转换为另一种类型。如果这种强制转换的结果可以被视为后一种类型的默认实例,那么效果将是使强制强制转换为半合法。

        【讨论】: