可能重复:
为什么要检查这个!= NULL?
// Determines whether two strings match.
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
public override bool Equals(Object obj)
{
//this is necessary to guard against reverse-pinvokes and
//other callers who do not use the callvirt instruction
if (this == null)
throw new NullReferenceException();
String str = obj as String;
if (str == null)
return false;
if (Object.ReferenceEquals(this, obj))
return true;
return EqualsHelper(this, str);
}
我不明白的是,它正在检查当前情况下,其实this
,反对无效。 注释是有点混乱,所以我想知道这是什么意见实际上意味着什么呢?
谁能给这如何能打破如果检查是不存在了,这是否意味着我还要把我的班,办理入住手续的例子吗?
这检查是有作为对本地代码的防护可与空调用函数this
指针。 这也不会在C#中发生,所以你不必把类似的守卫在你的代码。 这很可能是String
类是写C#定稿前,笔者可能会认为它很重要,以防止空,也许这只是常见的调用String
从本地代码和其他地方,这样更容易来调用空方法方法。
请注意,即使你设法得到所谓用空this
和你没有保护,所有将发生的是,除了会略有不同。 这可能是一个不同的异常,它可能由不同的成员抛出,但除此之外,它是不太可能有所作为。
换句话说,如果空校验是不存在的EqualsHelper
(或被叫方之一)会抛出异常,而不是Equals
。 因为它是需要隐藏用户可见的函数的内部,是有意义的把支票右开头。
- 如C#和VB.NET语言使用callvirt抛出NullReference进入了一个实例方法之前(这== NULL)检查是没有必要的。
- 像F#和托管C ++(大部分时间)语言使用CALL指令,你可以进入一个实例方法与空this指针。 (此== NULL)确实有效果。
增加的空检查不仅意味着后者的语言,但也帮助调试性的位置扔在那里的错误(称之为空对象的实例方法)确实发生了。 如果不存在,你可以,只要这是从来没有取消引用调用类中的方法没有任何错误(访问成员变量)。 这可以走这么远是你的空对象几个方法调用没有工作,突然你会得到一个空引用异常回(其中实例数据被访问的方法)。
如果你看看.NET类里面的检查很清楚,只有在一些著名的类,如字符串不包含这样的后卫。 像其他的IndexOf方法不警惕这一点。 这是不一致的,但我认为这样的双零检查的性能损失不值得的,因为首创置业的大多数用户是它使用callvirt指令,其中第二空检查没有帮助的语言。
文章来源: Why does String.Equals(Object obj) check to see if this == null? [duplicate]