値を比較する方法

Comparing Values for Equality in .NET: Identity and Equivalence
値が同じかどうかを判別する方法には、何通りか用意されている…らしい。

①a == b
②a.Equals(b)
③object.Equals(a, b)
④object.ReferenceEquals(a, b)

③は、a, bいずれかがnullでも比較可能にするためのメソッドかな。
④は、値が等しいかというより、参照先のメモリアドレスが同じかどうかかな。

int val1 = 10;
object obj1 = val1;
object obj2 = val1;

var isEqual1 = obj1 == obj2;//false
var isEqual2 = obj1.Equals(obj2);//true
var isEqual3 = object.Equals(obj1, obj2);//true
var isEqual4 = object.ReferenceEquals(obj1, obj2);//false

intは値型なので、obj1, obj2に渡されるのはアドレスではなく、値になる。なのでisEqual4はfalseになる。それはわかるけど、==もfalseになるんだな。という事は、C#もJavaと同じで==はメモリアドレス参照になるのか。
↑のリンクでは、以下の比較も行なっている

object val2 = 10;
object obj3 = val2;
object obj4 = val2;

var isEqual6 = obj3 == obj4;//true
var isEqual7 = obj3.Equals(obj4);//true
var isEqual8 = object.Equals(obj3, obj4);//true
var isEqual9 = object.ReferenceEquals(obj3, obj4);//true

元々がobjectとして扱っているので、obj3,obj4は同じメモリアドレスを参照することになるという事か。ちなみに、string型の場合。

string str1 = "AAA";
string str2 = "aaaa".ToUpper().Substring(0, 3);

var isEqualA = str1 == str2;//true
var isEqualB = str1.Equals(str2);//true
var isEqualC = object.Equals(str1, str2);//true
var isEqualD = object.ReferenceEquals(str1, str2);//false
string型を比較した場合、ReferenceEquals=false(比較先のメモリアドレスが異なる)でも、==はtrueになるようだ。でも、object型で扱うと、↓のような結果になる。

object str1 = "AAA";
object str2 = "aaaa".ToUpper().Substring(0, 3);

var isEqualA = str1 == str2;//false
var isEqualB = str1.Equals(str2);//true
var isEqualC = object.Equals(str1, str2);//true
var isEqualD = object.ReferenceEquals(str1, str2);//false
object型で扱う限り、==はメモリアドレス参照が同じかどうかを判定する。汎用化の為にstaicメソッド化する時、objectとして扱う場合は注意が必要、という事かな。
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: C# | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m