[解決済み] C# .Equals()、.ReferenceEquals()と==演算子
疑問点
私の理解では、この3つは
-
.Equals()
は、データの等質性をテストします (より良い説明はできませんが)。.Equals()
は同じオブジェクトの異なるインスタンスに対して真を返すことができ、これは最も一般的にオーバーライドされるメソッドです。 -
.ReferenceEquals()
は、2つのオブジェクトが同じインスタンスであるかどうかをテストし、オーバーライドすることはできません。 -
==
はReferenceEquals()
をデフォルトとしますが、これはオーバーライドすることができます。
しかし C#ステーション の状態になります。
オブジェクトクラスでは
Equals
とReferenceEquals
メソッドは は意味的に同じですが はReferenceEquals
は オブジェクトのインスタンスにのみ作用します。 またReferenceEquals
メソッドは静的です。
今、私はそれを得ることはありません。どなたか、この件に光を当てていただけませんか?
どのように解決するのですか?
あなたの混乱の原因は、C# station からの抜粋にタイプミスがあることだと思われます。 と同じです。 はオブジェクトのインスタンスに対してのみ動作します。ReferenceEqualsメソッドはstatic."です。
それぞれの意味上の違いについては、おおよそ正しいです("同じオブジェクトの異なるインスタンス" は少し混乱しているようですが、おそらく "same タイプ と読むべきでしょう)、そして、どれをオーバーライドすることができるかについてです。
それはさておき、質問の最後の部分、すなわち、それらがどのようにプレーンな
System.Object
インスタンスと
System.Object
の参照 (ポリモーフィックでない
==
). ここでは、3つの操作のすべてが動作します
と同じように
になりますが、注意点があります。
Equals
を呼び出すことはできません。
null
.
Equals
はインスタンスメソッドで
1
パラメータ (これは
は
である
null
). これはインスタンスメソッド (実際のオブジェクトに対して起動される必要がある) なので
null
-の参照で呼び出すことはできません。
ReferenceEquals
は静的メソッドで
2
のどちらか、あるいは両方のパラメータを受け取ります。
null
. これは静的なものなので(オブジェクトと関連付けられていない
インスタンス
を投げることはありません。
NullReferenceException
を投げません。
==
は演算子で、この場合 (
object
) と同じ振る舞いをします。
ReferenceEquals
. これは
NullReferenceException
も投げません。
説明するために
object o1 = null;
object o2 = new object();
//Technically, these should read object.ReferenceEquals for clarity, but this is redundant.
ReferenceEquals(o1, o1); //true
ReferenceEquals(o1, o2); //false
ReferenceEquals(o2, o1); //false
ReferenceEquals(o2, o2); //true
o1.Equals(o1); //NullReferenceException
o1.Equals(o2); //NullReferenceException
o2.Equals(o1); //false
o2.Equals(o2); //true
関連
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】プロセスが実行されているかどうかを知るには?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] Distinct() with lambda?
-
[解決済み] Javaにおける==とequals()の違いは何ですか?
-
[解決済み] C#の==とEquals()の違いについて
-
[解決済み] と "is "は違うのですか?
-
[解決済み] イコール、エクル、==、==の違いは何ですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 保護レベルによりアクセス不能になりました。
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】C# - パスに不正な文字がある場合
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】パラメータ付きRedirectToAction
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] C#の==とEquals()の違いについて