この質問とジョンの答えは、これが存在することさえあることに気づいたので、興味を持って Visual Studio を起動しました。
MSDN ページの 1 つの例をたどってから、独自の小さな例を作成しました。それは次のとおりです。
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();
}
- オペレーターメソッドは正確に何をしますか? ある種のブードゥー教の黒魔術が行われているようです。