This question Jon的回答讓我意識到這個問題甚至存在,所以我很好奇並推出了Visual Studio。覆蓋類型的Equals和GetHashCode,它有'dib''?
我跟着沿MSDN頁面的一個例子,然後我創建了自己的小例子。這是如下:
public class Person : IEquatable<Person>
{
public string IdNumber { get; set; }
public string Name { get; set; }
public bool Equals(Person otherPerson)
{
if (IdNumber == otherPerson.IdNumber)
return true;
else
return false;
}
public override bool Equals(object obj)
{
if (obj == null)
return base.Equals(obj);
if (!(obj is Person))
throw new InvalidCastException("The Object isn't of Type Person.");
else
return Equals(obj as Person);
}
public override int GetHashCode()
{
return IdNumber.GetHashCode();
}
public static bool operator ==(Person person1, Person person2)
{
return person1.Equals(person2);
}
public static bool operator !=(Person person1, Person person2)
{
return (!person1.Equals(person2));
}
}
所以,我有幾個問題:
如果Equals方法在處理我的自定義平等做得很好,爲什麼我必須重寫GetHashCode方法爲好?
當比較類似下面的內容時,使用哪個比較器,Equals或GetHashCode?
。
static void Main(string[] args)
{
Person sergio = new Person() { IdNumber = "1", Name = "Sergio" };
Person lucille = new Person() { IdNumber = "2", Name = "Lucille" };
List<Person> people = new List<Person>(){
sergio,
lucille
};
Person lucille2 = new Person() { IdNumber = "2", Name = "Lucille" };
if (people.Contains(lucille2))
{
Console.WriteLine("Already exists.");
}
Console.ReadKey();
}
- 究竟做操作方法呢?它看起來像某種巫術黑魔法在那裏。
格式化程序的行爲很奇怪。如果有人能解決這個問題,那就太好了。 :) – 2011-04-09 22:13:21
如果對象是錯誤的類型,請不要拋出。如果對象是錯誤的類型,那麼*它不相等*,因此正確答案是「false」。 – 2011-04-09 22:13:29
@Eric:該部分直接從MSDN示例中複製,嘿嘿。但你有道理,它應該只是返回假。 :) – 2011-04-09 22:14:21