2009-06-05 11 views
7

私はC#(オブジェクト)0 ==(オブジェクト)0

0 == 0     // return true 
(object) 0 == (object) 0 // return false 

なぜそれが参照の比較の代わりにキャストの値を比較するように見えますか。

Reflectionでは、オブジェクトを返すValueTypeのデフォルト値を取得しています。オブジェクトの現在の値と比較すると、同じではないが同じ値を返すためです。

EqualsまたはToStringの使用は、ValueTypeオブジェクトでは機能しますが、ReferenceTypeでは使用できません。これは、nullでもかまいませんので、EqualsまたはToStringを許可しません。

もしオブジェクトが==オブジェクトが間違った方法であるように思われるので、誰かが私にどのような型でもよい別のオブジェクトを比較できるか教えてください。この場合、オブジェクトを元のタイプにリキャストする必要がありますか?ReferenceTypeは常に異なるでしょうか?

+1

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.71).aspx(ボクシングリファレンス) – meandmycode

答えて

25

はい、それはボクシングの両側であり、参照を比較しています。新しいオブジェクトを作成するたびに、参照が異なります。

Equalsメソッドと比較すると、無効であることを考慮した方法です。

if (object.Equals(x, y)) 
{ 
    ... 
} 
4

あなたはボクシングだから、 'キャスト'は実際にはそれぞれ新しいオブジェクトを作成します。あなたがあなたのオブジェクトと比較しているなら、独自の.Equals実装を書かなければならないかもしれません。

0

基本的に、上記は、2つのオブジェクト参照を作成して、メモリアドレスを比較し、メモリ内の異なる場所に格納する:最も簡単な方法は、静的object.Equals(object, object)方法を使用することです。その理由のために毎回falseを返します。

私が知っている2つのオブジェクトを比較する唯一の方法は、一方または両方のオブジェクトがnullであるかどうかを調べることです(どちらか一方がnullであり、他方でない場合、それらは等しくはありません。 null == null)どちらもnullでない場合は、安全にオブジェクトの.equalsを呼び出すことができます。

0

キャストは、本質的に新しいオブジェクトを作成するボクシングを強制し、次に参照を比較します。あなたが(参照が指すオブジェクトの実装の比較を使用)の代わりに、コンテンツによってオブジェクトを比較したい場合は、Equalsメソッドを使用する必要があります。

Console.Write(((object)0).Equals((object)0)); // outputs "True" 
0

これは、物事を少し明確にします。

オブジェクトゼロ=(オブジェクト)0; return(object.Equals(ゼロ、ゼロ)); // trueを返します

関連する問題