Equals、ReferenceEquals、== の違い

Dec 16, 2016 am 09:53 AM
equals

.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 の場合はどうなりますか?結果は真実です。彼らは例外をスローしません。

Instance Equals

Instance Equals は、比較的複雑な比較方法です。 Equals のインスタンスは、参照が同じオブジェクトを指しているかどうかを比較したり、オブジェクトを値で比較したりできます。オブジェクトを値で比較したい場合は、Equals オブジェクトをオーバーロードして比較ロジックを実装する必要があります。同時に、Equals はデフォルトで比較値タイプの等価性もサポートします。では、オブジェクトの値の等価比較を可能にするために Equals をオーバーロードするにはどうすればよいでしょうか?


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されたコードを見てください

publicクラスの人{

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; ;
}

public override bool Equals(object obj)

{
if (obj != null && obj は person)
{
person p = obj as Person;

return (personId == p.personId) && ( FirstName == p.FirstName) && (LastName == p.LastName);

}

else

{
return false;
}

public override int GetHashCode()

{

returnbase.GetHashCode()^personId ;

}

}
呼び出しコード

人物 person1 = 新しい人物(1,"エドリック","リュー");
人物 person3 = 新しい人物 (2, "メシ", "ルオ"); ;

人 person4 = 新しい人(1, "エドリック", "リュー");

Console.WriteLine(person4.Equals(person1));

結果として、最初のものが 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); 

学生 s4 = s3;

Console.WriteLine(s1==s3); 

Console.WriteLine(s3==s4); 
最初の 1 つは false、2 番目のは true です。これは、私たちの概念に適合しないため、Equals を再ロードするには == を再ロードする必要があり、同様に重畳する == も Equals を再ロードする必要があります。 setcoll[0]==co[0] は参照ですが、私たちの Equals 比較がオブジェクトの値である場合、最後の世代コードも使用できません。

== 算数

== 号算子のその他の例の Equals には大きな領域がありません、== は算数、Equals はメソッドです。他のものは上書きできます。 == の重畳に関しては、数値内の数値重畳を参照することができます。 null は false を返しますが、特別な値の種類を比較した場合は、最初から false を返します。 Equals: 静的なメソッドであり、上書きできません。Equals、比較参照、または比較値がない場合は、Equals メソッドを再ロードします。 、常用

== 算数: 参照することも、値を指定することもできます。

MoreEquals,ReferenceEquals,==的領域别相关文章关注PHP中文网!
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

次のレベルのCコンパイラを追加する方法 次のレベルのCコンパイラを追加する方法 Mar 03, 2025 pm 05:44 PM

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

C言語のnullの代替案は何ですか C言語のnullの代替案は何ですか Mar 03, 2025 pm 05:37 PM

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

どの言語コンパイラが優れていますか? どの言語コンパイラが優れていますか? Mar 03, 2025 pm 05:39 PM

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

nullは、C言語での最新のプログラミングではまだ重要ですか? nullは、C言語での最新のプログラミングではまだ重要ですか? Mar 03, 2025 pm 05:35 PM

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

C言語コンパイラのWebバージョンは何ですか? C言語コンパイラのWebバージョンは何ですか? Mar 03, 2025 pm 05:42 PM

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

C言語コンパイラによるコードをコピーする方法 C言語コンパイラによるコードをコピーする方法 Mar 03, 2025 pm 05:43 PM

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

c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 c言語オンラインプログラミングウェブサイトc言語コンパイラ公式ウェブサイトの要約 Mar 03, 2025 pm 05:41 PM

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

c言語コンパイラインストールチュートリアル(コンピューターバージョン) c言語コンパイラインストールチュートリアル(コンピューターバージョン) Mar 03, 2025 pm 05:41 PM

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

See all articles