[英]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.