为什么String.IsNullOrEmpty(str)而不是str.IsNullOrEmpty()?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么String.IsNullOrEmpty(str)而不是str.IsNullOrEmpty()?相关的知识,希望对你有一定的参考价值。
有人可以向我解释为什么在.NET中我会写String.IsNullOrEmpty(str)
而不是str.IsNullOrEmpty()
?必须有合理的理由,但我不知道。
听起来你们都在说
- 你不能从C#/ .NET中为空的对象中调用方法(我在C ++中这样做,它只是不访问任何成员变量)
- .NET 2.0中不存在扩展方法
- 微软并不打算更新标准,可能觉得它无关紧要
如果IsNullOrEmpty是一个实例方法,则在null实例上调用它会抛出NullReferenceException,而不是像你想要的那样返回false。
它可能是一种扩展方法,但它可能会让人感到困惑 - 它看起来像一个实例方法,但不会像一个方法那样。
如果str为null,则它将没有任何可访问的方法,因为没有对象的实例。尝试在空对象上调用方法时,您将获得空引用异常。
String.IsNullOrEmpty是静态的,因此它始终可用于测试字符串对象。
我想你可以争辩说拥有str.IsEmpty可能很方便(就像Jonathan说的那样,你可以为字符串对象制作一个extenion method来处理这个),但实际上它也很容易调用String.IsNullOrEmpty(str)和覆盖两种情况。即使它们不相同,但在处理字符串的值时,大多数人将它们等同于(在业务逻辑方面并验证字符串的值是否存在)。
String.IsNullOrEmpty
是一种类方法。
如果str是Nothing
(Null)那么你就不能在它上面调用一个方法。您只能在对象上调用实例方法。
IsNullOrEmpty
是string
类的静态方法;它不是实例方法。这是因为如果str
是null
,那么调用实例方法是没有意义的,因为你会得到一个NullReferenceException
。因此,IsNullOrEmpty
必须是静态方法。
我一直在使用扩展方法一段时间。效果很好。
public static bool IsNullOrEmpty(this string val)
{
return string.IsNullOrEmpty(val);
}
它显然与string.IsNullOrEmpty(字符串)做同样的事情,但它更容易做类似的事情
if(mystring.IsNullOrEmpty())
{
//... do something
}
如果可以为静态类型的空引用定义默认行为,在某些情况下会很好。使用扩展方法,在许多情况下可以有效地实现这一点。但是有一些陷阱。例如,在.net语言中通常禁止将对象转换为不相关的类型,因为在运行时不会出现这种行为合法的情况。另一方面,如果一个对象为null,则可以将其强制转换为object,然后将Object null转换为另一种类型。如果这种类型转换的结果可以被视为后一种类型的默认实例,那么效果将是使得转换为半合法。
以上是关于为什么String.IsNullOrEmpty(str)而不是str.IsNullOrEmpty()?的主要内容,如果未能解决你的问题,请参考以下文章
转载:string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法的区别
string.IsNullOrEmpty和string.IsNullOrWhiteSpace方法的区别
string.IsNullOrEmpty 和 string.IsNullOrWhiteSpace 为空字符串返回 false