ホームページ > バックエンド開発 > C#.Net チュートリアル > C#の==とequals()の違いは何ですか

C#の==とequals()の違いは何ですか

高洛峰
リリース: 2016-12-16 10:28:46
オリジナル
1248 人が閲覧しました

以下のようなコード:

1

2

3

4

5

6

7

8

9

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に変換できないので呼び出されません。

キャスト変換を使用してこのメ​​ソッドを強制的に呼び出すことができます:

1

Console.Writeline(newAge.Equals((short)age)); //true

ログイン後にコピー

これはボックス化せずに short.Equals(short) を直接呼び出します。 age が 32767 より大きい場合、オーバーフロー例外がスローされます。

short.Equals(object) オーバーロードを呼び出すこともできますが、同じ型のボックス化されたオブジェクトを明示的に渡す必要があります:

1

Console.WriteLine(newAge.Equals((object)(short)age)); // true

ログイン後にコピー

前のオプションのメソッド (short.Equals(short )) と同様に、サイズが短い範囲を超える場合も、オーバーフロー例外がスローされます。以前のソリューションとは異なり、オブジェクトを短くボックス化するため、時間とメモリが無駄になります。

ソースコード:

実際に使用されているEquals()は次のとおりです:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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中国語!


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート