端くれプログラマの備忘録 C# [C#] オブジェクトを比較する

[C#] オブジェクトを比較する

基本的にC#ではポインタは使えない。unsafeコードとして記述すればポインタも使えるが、バグを生む危険性が高まるのでよほど必要でない限りはポインタは使わないほうが望ましい。しかしC++の癖で、2つのインスタンスが同じかどうかの判断を if (a == b) と書いてハマったので、オブジェクトの等価比較について整理しておきたい。

値が同じかどうか判断する

たとえば整数ならば if (a == b) で比較できる。しかし、あるクラスのインスタンスなど、複雑なオブジェクトを比較するとなると簡単にいかない。その場合には Object.Equals(Object) メソッドを実装してやればよい。

MyClass a = new MyClass();
MyClass b = new MyClass();
...
if (a.Equals(b)) {
    Trace.WriteLine("aとbは等値");
} else {
    Trace.WriteLine("aとbは等値ではない");
}

参照先が同じかどうか判断する

これはC/C++で言うところのポインタ比較に相当する。すなわち、2つのポインタが同じオブジェクトを指しているかどうかを比較するわけだ。その場合には System.Object.ReferenceEquals(objA, objB) メソッドを利用する。

MyClass a = new MyClass();
MyClass b = a;
...
if (System.Object.ReferenceEquals(a, b)) {
    Trace.WriteLine("aとbは同じオブジェクト");
} else {
    Trace.WriteLine("aとbは違うオブジェクト");
}

参考サイト

等価比較 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/vstudio/dd183752.aspx

Object.Equals メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.object.equals.aspx

Object.ReferenceEquals メソッド (System)
http://msdn.microsoft.com/ja-jp/library/system.object.referenceequals.aspx