いつも調べるのでまとめておく。(書きかけっぽい感じですみません。。。)
比較についてのコラム的なものはこちらのコメントを参照してください。
Object.ReferenceEquals(Object objA, Object objB) メソッド
- その名の通り参照の等価を比較
-
Object
型に対するa == b
と等価 - ==演算子をオーバーロードするときにお世話になるかも(普通に
a == null
を呼び出すと無限ループになるため)
Object.Equals(Object objA, Object objB) メソッド
- 両方、あるいは片方が
null
であればその場でtrue
もしくはfalse
を判定して返す。 - そうでなければ(両方とも
null
でなければ)objA.Equals(objB)
を呼び出す。 -
IEquatable<T>
は利用されない。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Object.Equals(new Hoge { Fuga = "abc" },
new Hoge { Fuga = "abc" }));
// -> True
Console.WriteLine(Object.Equals(new Hoge { Fuga = "abc" },
new Hoge { Fuga = "xyz" }));
// -> False
Console.Read();
}
}
public class Hoge : IEquatable<Hoge>
{
public string Fuga { get; set; }
public override bool Equals(object obj)
{
if (Fuga == "xyz") throw new NotImplementedException();
if (obj == null) return false;
if (obj is Hoge)
{
return ((Hoge)obj).Fuga == Fuga;
}
return base.Equals(obj);
}
public override int GetHashCode()
{
return (Fuga != null ? Fuga.GetHashCode() : 0);
}
public bool Equals(Hoge other)
{
throw new NotImplementedException();
}
}
EqualityComparer.Default.Equals(T x, T y) メソッド
IEquatable<T>
が利用される点が異なる。
-
null
チェックについてはObject.Equals(Object, Object)
と同様。 -
x
がIEquatable<T>
を実装する場合はIEquatable<T>.Equals(T other)
が呼び出される。 - さもなければ
Object.Equals(Object obj)
が呼び出される。
EqualityComparer クラス
-
IEqualityComparer<T>
を実装するための基底クラス。 -
Equals(T x, T y)
およびGetHashCode(T obj)
をオーバーライドして使用する。
StringComparer クラス
-
IComparer<string>
,IEqualityComparer<string>
の 2 つを実装。 -
StringComparison
列挙体に対応した序列判定、等価性判定を提供する。
IStructuralEquatable インターフェース
^m^