为什么String.Equals(obj对象)检查,看看是否== NULL? [重复](Why

2019-09-16 13:41发布

可能重复:
为什么要检查这个!= 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 ,反对无效。 注释是有点混乱,所以我想知道这是什么意见实际上意味着什么呢?

谁能给这如何能打破如果检查是不存在了,这是否意味着我还要把我的班,办理入住手续的例子吗?

Answer 1:

这检查是有作为对本地代码的防护可与空调用函数this指针。 这也不会在C#中发生,所以你不必把类似的守卫在你的代码。 这很可能是String类是写C#定稿前,笔者可能会认为它很重要,以防止空,也许这只是常见的调用String从本地代码和其他地方,这样更容易来调用空方法方法。

请注意,即使你设法得到所谓用空this和你没有保护,所有将发生的是,除了会略有不同。 这可能是一个不同的异常,它可能由不同的成员抛出,但除此之外,它是不太可能有所作为。

换句话说,如果空校验是不存在的EqualsHelper (或被叫方之一)会抛出异常,而不是Equals 。 因为它是需要隐藏用户可见的函数的内部,是有意义的把支票右开头。



Answer 2:

  • 如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]