Equals、ReferenceEquals、== の違い
.net
オブジェクトの静的ReferenceEquals()
オブジェクトの静的Equals()
オブジェクトの例Equals()
operator==
には、同等性を比較する方法がいくつかあります。以下にそれらの違いと使用法を紹介します。
ReferenceEquals
ReferenceEquals は、参照型の参照が同じオブジェクトを指しているかどうかを比較するために使用されます。参照型のみを比較できます。値の型が渡されると、常に false が返されます。これは、値の型がパラメーターとして使用される場合、最初にボックス化されるためです。ボックス化された値の型が等しいことを参照する場合でも、依然として 2 つの異なるオブジェクトであるため、変数は を指します。異なるオブジェクトなので、常に false を返します。
int x = 10;
int y = 10;
bool b1 = object.ReferenceEquals(x,y);
参照型を比較している場合、2 つの参照が同じを指している場合、結果は必ず false を返します。 object の場合、それは true です。 Entity Class first -Public Classの人を定義します;
パブリック文字列FirstName
get { return _firstName; }}
プライベート文字列_lastName;
public string LastName
{ _lastNameを返す }値 ; }
}
public Person() { }
public Person(int personId, string firstName, string lastName)
{this._personId = personId
this._lastName = lastName;
}
}
呼び出しコード
人物 person1 = 新しい人物(1,"エドリック","リュー");
人物 person2 = 新しい人物(2, "メシ", "ルオ");人物 person3 = person2;
bool br1= object.ReferenceEquals(person1,person2);
bool br2 = object.ReferenceEquals(person2, person3);
最初のものは false を返し、2 つ目は true を返すことがわかります。では、オブジェクトの 1 つが null の場合、または両方のオブジェクトが null の場合はどうなるでしょうか?結果は false になりますが、両方とも null の場合はどうなりますか?結果は真実です。彼らは例外をスローしません。
MSDN にはいくつかのガイドラインがリストされています
浮動小数点型が関係する場合を除き、x.Equals(x) は true を返します。
x.Equals(y) は y.Equals(x) と同じ値を返します。
x.Equals(y) は、x と y の両方が NaN の場合に true を返します。
(x.Equals(y) && y.Equals(z)) は、x.Equals(z) が true を返す場合にのみ true を返します。
x.Equals(y) を連続して呼び出すと、x と y によって参照されるオブジェクトが変更されない限り、同じ値が返されます。
x.Equals(nullNothingnullptrnull 参照 (Visual Basic では Nothing)) は false を返します。 shotされたコードを見てください
privateint _personid; _firstName ;
パブリック文字列 FirstName
{get { return _firstName; }
set { _firstName = 値; }}
プライベート文字列 _lastName;
public string LastName
{get { return _lastName; = 値; }
}パブリック パーソン() { }パブリック パーソン(int personId, string firstName, string lastName){
this._personId = personId =this._lastName = lastName; ;
}
{
if (obj != null && obj は person)
{
person p = obj as Person;
}
else{
return false;
}
public override int GetHashCode()
returnbase.GetHashCode()^personId ;
}}
呼び出しコード
人物 person1 = 新しい人物(1,"エドリック","リュー");
人物 person3 = 新しい人物 (2, "メシ", "ルオ"); ;
結果として、最初のものが true で、2 番目のものが false になります。リロード中に例外が発生してはなりません。では、Person を継承するクラスがある場合、派生クラスをどのように比較すればよいでしょうか?
public クラス Student:People
{
private int _studentNumber;
public int StudentNumber
{
get { return _studentNumber; }
set { _studentNumber = 値; }
}
public Student() { }
public Student(int personId, string firstName, string lastName, int studentsNumber)
{
this.personId = personId;
this.FirstName = 名;
this.LastName = lastName;
this._studentNumber = 学生番号;
}
public override bool Equals(object obj)
{
if (obj != null && obj is Person)
{
Student s = obj as Student;
base.Equals(obj)&&StudentNumber==s.StudentNumber; を返します。
}
else
{
return false;
}
}
public override int GetHashCode()
{
returnbase.GetHashCode()^StudentNumber;
}
}
调用代码
生徒 s1 = 新しい生徒(1, "エドリック", "リュー", 1);
学生 s2 = 新しい学生(2, "Meci", "Luo", 2);
生徒 s3 = 新しい生徒(1, "エドリック", "リュー", 1);
Console.WriteLine(s1.Equals(s2));
Console.WriteLine(s1.Equals(s3));
私が必要としているのは、父クラスの Equals メソッドと、派生クラス内の新しい値を比較することだけです。種類比較の型に例の Equals がロードされている場合は、true を返すこともできます。
1、同じオブジェクトを参照する
2、2 つの null を比較する
3 ,重ロードEqualsの例メソッドを返すtrue
Student s1 = new Student(1, "Edrick", "Liu", 1);
学生 s2 = 新しい学生(2, "Meci", "Luo", 2);生徒 s3 = 新しい生徒(1, "エドリック", "リュー", 1);
学生 s4 = s3;
Console.WriteLine(object.Equals(s1,s3));
Console.WriteLine(object.Equals(s4, s3));
この 2 つは両方とも true で、ここでは静的な Equals には 1 つの領域があり、静的な Equals にはパラメータが null の場合に異常が発生します。重ロード==运算符,会発行什么
Student s1 = new Student(1, "Edrick", "Liu", 1);
学生 s2 = 新しい学生(2, "Meci", "Luo", 2);
生徒 s3 = 新しい生徒(1, "エドリック", "リュー", 1);
Console.WriteLine(s3==s4);
最初の 1 つは false、2 番目のは true です。これは、私たちの概念に適合しないため、Equals を再ロードするには == を再ロードする必要があり、同様に重畳する == も Equals を再ロードする必要があります。 setcoll[0]==co[0] は参照ですが、私たちの Equals 比較がオブジェクトの値である場合、最後の世代コードも使用できません。
== 算数
== 号算子のその他の例の Equals には大きな領域がありません、== は算数、Equals はメソッドです。他のものは上書きできます。 == の重畳に関しては、数値内の数値重畳を参照することができます。 null は false を返しますが、特別な値の種類を比較した場合は、最初から false を返します。 Equals: 静的なメソッドであり、上書きできません。Equals、比較参照、または比較値がない場合は、Equals メソッドを再ロードします。 、常用
== 算数: 参照することも、値を指定することもできます。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











この記事では、printf内の\ nエスケープシーケンスを使用してcで新しいライン文字を作成し、関数を置く方法について説明します。 機能を詳しく説明し、出力のラインブレークに使用することを示すコード例を提供します。

この記事では、CのNull Poernter recerferenceの課題を調査します。問題は、問題はnullではなく、その誤用であると主張しています。 記事では、参照前のチェック、ポインターInitialiなど、非参照を防止するためのベストプラクティスの詳細

この記事は、Cコンパイラの選択に関する初心者を案内しています。 GCCは、使いやすさ、幅広い可用性、広範なリソースが初心者に最適であるため、最適であると主張しています。 ただし、GCC、Clang、MSVC、およびTCCも比較して、その違いを強調しています

この記事では、現代のCプログラミングにおけるNullの継続的な重要性を強調しています。 進歩にもかかわらず、Nullは明示的なポインター管理にとって重要なままであり、有効なメモリアドレスがないことをマークすることにより、セグメンテーションの障害を防ぎます。 最高のPRAC

この記事では、初心者向けのオンラインCコンパイラをレビューし、使いやすさとデバッグ機能に焦点を当てています。 OnlineGDBとRepl.itは、ユーザーフレンドリーなインターフェイスと役立つデバッグツールのために強調表示されます。 プログラムやコンパイルなどのその他のオプション

この記事では、C IDEでの効率的なコードコピーについて説明します。 コピーはコンパイラ機能ではなくIDE機能であり、IDE選択ツールの使用、コード折りたたみ、検索/交換、テンプラなど、効率を向上させるための詳細戦略であることを強調しています。

この記事では、オンラインCプログラミングプラットフォームを比較し、デバッグツール、IDE機能、標準コンプライアンス、メモリ/実行の制限などの機能の違いを強調しています。 「最良の」プラットフォームはユーザーのニーズに依存していると主張しています。

このチュートリアルは、Windows、MacOS、LinuxにCコンパイラをインストールすることでユーザーをガイドします。 人気のコンパイラ(MINGW、Visual Studio、XCode、GCC)のインストールを詳述し、環境可変構成を説明し、トラブルシューティング手順を提供します
