【C#】同値性と同一性
プログラミングをする上で、変数が同じかを比較するという操作は良く行われる。
しかし、この値の比較は値型と参照型で少し挙動が異なってくる。
同値性と同一性
「変数が同じ」という時に、そこには2つの意味合いがある。
一つは、同値性。
これは、二つの変数の値が同じであるということである。
もう一つは、同一性。
これは、二つの変数が同じメモリを参照しているかということである。
値型、参照型、string型の比較方法
同一性、同値性を比較する際は、「==」演算子や「equals」メソッドを使用する。
しかし、これらはオブジェクトによって微妙に動きが異なるために、注意が必要になってくる。
値型
値型は、「==」、「equals」の両方で同値性を確認することができる。
「==」、「equals」のどちらを使用しても、値が同じかを検証するということ。
それぞれが別の変数(メモリ)に格納されていても関係ない。
1 2 3 4 |
int int1 = 1; int int2 = 1; Console.WriteLine(int1 == int2; //true Console.WriteLine(int1.Equals(int2)); //true |
参照型
参照型の場合は、「==」、「equals」で挙動が異なる。
「==」は、同一性、つまりそのオブジェクトが同じメモリを参照しているか。
「equals」は、同値性、つまりそのオブジェクトが同じ値を有するかを検証する。
1 2 3 4 5 6 |
var obj1 = new { name = "taro"}; var obj2 = new { name = "taro"}; var obj3 = obj1; Console.WriteLine(obj1 == obj2); //false Console.WriteLine(obj1.Equals(obj2)); //true Console.WriteLine(obj1 == obj3); //true |
参照型:string
参照型でもstringは、挙動がことなる。
「==」、「equals」どちらでも同値性の確認を行う。
これは、「==」演算子がオーバーライドされているためである。
1 2 3 4 |
string str1 = "a"; string str2 = "a"; Console.WriteLine(str1 == str2); //true Console.WriteLine(str1.Equals(str2)); //true |
まとめ
・int型は、「==」、「equals」どちらも同値性を検証する。
・オブジェクト型(string以外)は「==」が同一性、「equals」が同値性を検証する。
・オブジェクト型(string型)は、「==」、「equals」どちらも同値性を検証する。