以下のようなコード:
int age = 25; short newAge = 25; Console.WriteLine(age == newAge); //true Console.WriteLine(newAge.Equals(age)); //false Console.ReadLine();
intとshortはプリミティブ型ですが、「==」で比較するとtrueが返され、equals()はfalseを返します。なぜ?
答え:
要するに:
「equals()」は「==」よりも複雑です。
具体的には:
元の型は基本クラスの object.Equals(object) をオーバーライドし、括弧内のオブジェクトがその型と値と同じ場合に true を返します (Nullable 型も上記に適していることに注意してください)空でない Nullable 型は常に基本型インスタンスにボックス化されます)。
newAge が短いため、オブジェクトが短く、値が newAge 値と等しい場合、 newAge.Equals(object) は true を返します。渡しているのは int オブジェクトなので、false を返します。
これに対して、「==」演算子は、2つの整数(int)、または2つの短整数(short)、または2つの長整数(long)を使用する演算として定義されます。 「==」の 2 つのパラメーターが integer と short integer の場合、コンパイラーは暗黙的に short を int に変換し、変換された int 値のサイズを比較します。
それを機能させる他の方法:
プリミティブ型にも独自のequals() メソッドがあり、equals は同じ型のパラメーターを受け入れます。
age.Equals(newAge)と書くと、コンパイラはint.Equals(int)を最適なオーバーロードメソッドとして選択し、暗黙的にshortからintに変換します。このメソッドは 2 つの int 値のサイズを直接比較するため、true が返されます。
Shortにもshort.Equals(short)メソッドがありますが、int型は暗黙的にshortに変換できないので呼び出されません。
キャスト変換を使用してこのメソッドを強制的に呼び出すことができます:
Console.Writeline(newAge.Equals((short)age)); //true
これはボックス化せずに short.Equals(short) を直接呼び出します。 age が 32767 より大きい場合、オーバーフロー例外がスローされます。
short.Equals(object) オーバーロードを呼び出すこともできますが、同じ型のボックス化されたオブジェクトを明示的に渡す必要があります:
Console.WriteLine(newAge.Equals((object)(short)age)); // true
前のオプションのメソッド (short.Equals(short )) と同様に、サイズが短い範囲を超える場合も、オーバーフロー例外がスローされます。以前のソリューションとは異なり、オブジェクトを短くボックス化するため、時間とメモリが無駄になります。
ソースコード:
実際に使用されているEquals()は次のとおりです:
public override bool Equals(Object obj) { if (!(obj is Int16)) { return false; } return m_value == ((Int16)obj).m_value; } public bool Equals(Int16 obj) { return m_value == obj; }
C#の==とequals()の違いの詳細については、次の点に注意してください。関連記事ならPHP中国語!