[解決済み] C#のプリミティブの==とEquals()の違いは何ですか?
質問
このコードを考えてみましょう。
int age = 25;
short newAge = 25;
Console.WriteLine(age == newAge); //true
Console.WriteLine(newAge.Equals(age)); //false
Console.ReadLine();
両方
int
と
short
はプリミティブ型ですが
==
との比較は真を返し
Equals
は偽を返します。
なぜ?
解決方法は?
簡単にお答えします。
平等は複雑です。
詳しい回答
プリミティブ型は、ベースとなる
object.Equals(object)
を返し、ボックス化された
object
が同じ
タイプ
と値を指定します。(これは nullable 型でも動作することに注意してください。null でない nullable 型は、常に基礎となる型のインスタンスに box します)。
以来
newAge
は
short
は、その
Equals(object)
メソッドは、ボックス化された
短い
を同じ値で指定します。あなたが渡しているのは、箱型の
int
ということで、falseが返されます。
これに対して
==
演算子は、2つの
int
を(または
short
または
long
s).
を付けて呼び出すと
int
と
short
の場合、コンパイラは暗黙のうちに
short
を
int
を実行し、結果の
int
を値で指定します。
その他の方法
プリミティブ型もまた、独自の
Equals()
メソッドで同じ型を受け取ります。
と書くと
age.Equals(newAge)
を選択し、コンパイラは
int.Equals(int)
を最適なオーバーロードとして、暗黙のうちに
short
を
int
. そして
true
というのは、このメソッドは単に
int
を直接指定します。
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
.
前の解決策とは異なり、これは
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#のStringとstringの違いは何ですか?
-
[解決済み] C#の正しいバージョン番号を教えてください。
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] SelectとSelectManyの違い
-
[解決済み] C#の==とEquals()の違いについて
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C# [解決済み] Critical error detected c0000374 - C++ dll returns pointer off allocated memory to C#.
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】インデックスが範囲外でした。コレクションパラメータname:indexのサイズより小さく、非負でなければなりません。
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] C#の==とEquals()の違いについて
-
[解決済み] なぜC#ではボクシングとアンボクシングが必要なのか?