他の人のコードを読むときに思わない出会いがよくあります。 今回調べてみようと思った「IEquatable」もその中の一つです。 c#が用意しているインターフェースということはわかるのですが、どのような時に使ったら良いのかを簡単ですが調べてみることにしました。
IEquatable
IEquatableにはEqualsというメソッドが定義されています。
IEquatable
[c] namespace System { public interface IEquatable<T> { bool Equals(T other); } } [/c]
実装例
[c] public class Hoge : IEquatable<Hoge> { public int id;
public Hoge(int value)
{
id = value;
}
public Hoge(){}
public bool Equals(Hoge other)
{
if (other == null)
{
return false;
}
return this.id == other.id;
}
} [/c]
Equals()を使ってオブジェクト同士を比較します。 [c] var test1 = new Hoge(1); Hoge test2 = new Hoge(10);; var test3 = test1; var text3 = new Hoge(1);
Debug.Log(test1.Equals(test2)); // false Debug.Log(test1.Equals(test3)); // true Debug.Log(test1.Equals(text3)); // true [/c]
継承して利用する
IEquatableを使うメリットとして、継承したクラスとの比較ができることです。
[c] public class HogeChild : Hoge,IEquatable<HogeChild> { public string name;
public HogeChild(int value, string text)
{
id = value;
name = text;
}
public bool Equals(HogeChild other)
{
if (other == null)
{
return false;
}
return base.Equals(other) && (this.name == other.name);
}
}
[/c]
HogeオブジェクトとHogeChildオブジェクトを比較してみます。 [c] var test1 = new Hoge(1); var test4 = new HogeChild(1, "たろう"); var test5 = new HogeChild(1, "たろう"); var test6 = new HogeChild(1, "花子");
Debug.LogError(test4.Equals(test5)); // true Debug.LogError(test4.Equals(test6)); // false Debug.LogError(test4.Equals(test1)); // true [/c]
このようにオブジェクトを比較できます。
最後に
ObjectクラスにはそもそもEquals(object obj)が定義されています。 IEquatableを使うメリットは型のキャストがないので、パフォーマンスが良いみたいです。 IEquatableを完全に理解する
ただ、こちらの記事を見る限り使い所がとても難しそうに思える、かつ実際の使い所がピンとこないので個人的には使う機会がない気がしています。