Equals、ReferenceEquals、== の違い

高洛峰
リリース: 2016-12-16 09:53:01
オリジナル
1060 人が閲覧しました

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