簡體   English   中英

obj1.Equals(obj2)和c#中的靜態Object.Equals(obj1,obj2)有什么區別?

[英]What's the difference between obj1.Equals(obj2) and static Object.Equals(obj1, obj2) in c#?

從Microsoft的文檔中,兩個Equals方法基本相同。 但我偶然發現了一些非常奇怪的事情。 在我的Silverlight項目中,我有兩個同一類的實例覆蓋了Equals。 如果我要inst1.Equals(INST2)inst2.Equals(INST1)我總是得到的結果是正確的 但是Object.Equals(inst1,inst2)返回false 這怎么可能?

有任何想法嗎?

謝謝,Rocko

obj1.Equals假定obj1不為null object.Equals甚至可以在null值上工作。 這並不能解釋你所看到的行為; 我認為你應該提供一些代碼來重現它以獲得更好的答案。

可以覆蓋obj1.Equals,Object.Equals不能。 換句話說,Object.Equals是Equals方法的基本實現,如果不覆蓋它,則可以免費獲得。 由於您確實覆蓋了它,因此兩種實現方式不同,可能會產生不同的結果。

我認為Object.Equals將測試2個參數是否是相同的引用,也就是說,它們指向相同的內存空間。

MyClass.Equals可能有不同的實現,因此不同參考的2個類實際上可能相等(基於它們的字段和屬性)。

小心正確實現IEquatable<T> 我做了以下錯誤:

public class SubjectDTO: IEquatable<SubjectDTO>
{
    public string Id;

    public bool Equals(SubjectDTO other)
    {
        return Object.Equals(Id, other.Id);
    }

    public override int GetHashCode()
    {
        return Id == null ? 1 : Id.GetHashCode();
    }
}

看起來不錯吧? 但是當你嘗試它時,你會發現令人驚訝的結果:

var a = new SubjectDTO() { Id = "1"};
var b = new SubjectDTO() { Id = "1"};
Console.WriteLine(Object.Equals(a, b));
Console.WriteLine(a.Equals(b));

False
True

咦? 好吧, 重要的是覆蓋Equals(object other)

public override bool Equals(object other)
{
    return other == null ? false : Equals(other as SubjectDTO);
}

將它添加到SubjectDTO類時,它將按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM