为什么要使用String.IsNullOrEmpty(str),而不是str.IsNullOrEmpty()?

9
有人能解释一下为什么在.NET中我要写String.IsNullOrEmpty(str)而不是str.IsNullOrEmpty()吗?肯定有一个逻辑上的原因,但我不知道是什么。
听起来你们在说:
  1. 在C#/.NET中,不能从空对象调用方法(在C++中可以这样做,只是它不能访问任何成员变量)
  2. .NET 2.0中不存在扩展方法
  3. Microsoft没有费心更新标准,可能认为这不重要

3
有趣的旁注:你可以在Smalltalk中实现这个功能,因为nil也是一个对象(它是UndefinedObject的单例实例)。 - Ash Wilson
使用扩展方法来实现这个目的是错误的,因为它利用了扩展方法的实现细节。这将有效地允许null.IsNullOrEmpty()成为一个合法的语句,即使它没有被编译成这样。 - Steve Guidi
完全重复:https://dev59.com/KXRB5IYBdhLWcg3wEDul - George Stocker
1
George Stocker:我并没有问为什么没有IsNotNullOrEmpty。我问的是为什么我不能写“string”.IsNotNullOrEmpty。 - user34537
6个回答

26
如果IsNullOrEmpty是一个实例方法,那么在空实例上调用它将抛出NullReferenceException异常,而不是像您期望的那样返回false。
它可以是一个扩展方法,但这样可能会令人困惑——它看起来像是一个实例方法,但并不像实例方法那样工作。

8
它不能是扩展方法;它存在于C# 3.0之前。 - jason
1
@Jason,我认为他的意思是你可以编写一个扩展方法来处理它。 - kemiller2002
3
你是否希望 IsNullOrEmpty 在收到一个 nullstring 实例时返回 true - jason
1
还记得在C++中的那些好日子吗?你可以做像bool IsNullOrEmpty(){ if(this == null) return true等这样的事情。 - dkackman
我认为下面有更正确的答案。IsNullOrEmptyString类上的静态方法。 - Jason
一个更简单的解释是,如果它是一个实例方法,那么它应该是 IsEmpty,因为此时检查 null 已经太晚了。 - Powerlord

9
如果str为空,它将没有任何可访问的方法,因为没有对象实例。尝试在null对象上调用方法会导致空引用异常。
String.IsNullOrEmpty是静态的,因此始终可用于测试字符串对象。
我想你可以说可能有一个str.IsEmpty(就像乔纳森所说的那样,你可以为字符串对象制作扩展方法来处理这个问题),但实际上调用String.IsNullOrEmpty(str)同样容易,并且涵盖了两种情况。即使它们不相同,大多数人在处理字符串值的业务逻辑和验证值是否存在时也会将它们视为相同。

5

String.IsNullOrEmpty是一个类方法。

如果str为Nothing(Null),则无法对其调用方法。您只能在对象上调用实例方法。


需要提到的是,它是实例类的静态方法,而不仅仅是类方法。如果它是一个类方法,那么他发布的内容就是正确的,即:string someobject; someobject.isnullorempty(); - JonH

4

我已经使用一个扩展方法一段时间了。非常好用。

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

它显然与string.IsNullOrEmpty(string)做的事情相同,但像这样做更容易

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

4

IsNullOrEmptystring类上的静态方法,而不是实例方法。这是因为如果strnull,调用实例方法就没有意义,否则会得到一个NullReferenceException异常。因此,IsNullOrEmpty必须是静态方法。


0
在某些情况下,如果能够为静态类型的空引用定义默认行为,那将是很好的。使用扩展方法,可以在许多情况下有效地实现这一点。然而,也有一些需要注意的地方。例如,在.NET语言中,通常禁止将对象转换为不相关的类型,因为在运行时没有合法的情况需要这样的行为。另一方面,如果一个对象为空,它可以被转换为object,然后将Object null转换为另一种类型。如果这样的转换结果可以被视为后一种类型的默认实例,那么效果就是使转换半合法化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接