オリジナル:https://www.cnblogs.com/wangjinpeng-study/p/3913892.html
問題を分析
この本の前の章では、著者はSystem.Objectのすべての方法で導入されました。比較対象を実行するように設計されている3つの方法がある、があります。
(1)、静的ブールも参照(オブジェクトA、オブジェクトB)。
(2)静的ブール値は、(オブジェクトA、オブジェクトB)に等しいです。
(3)仮想ブール値(オブジェクトOBJ)に等しいです。
1、静的メソッド:も参照用具比較基準タイプは、二つの値型のオブジェクトを比較するために使用することができるだけでなく、参照オブジェクトの二つのタイプを比較するために使用することができるパラメータタイプから見ることができます。当然のことながら、機能の値型と参照型に応じて、も参照の方法は、基準タイプに適用する場合にのみ意味を持つことができ、2つの値を比較するための基準の種類は関係なく、常にその値の、falseを返す等しいです。次のコードに設けた場合に実行されます。
私は0を= int型。 Console.WriteLineを(object.ReferenceEquals(I、I));
結果はまだ読者がボクシングから原則しようとする理由について考えボックス化解除することができ、falseになります。
2、静的メソッド:等しい機能はタイプによって異なる実装別の静的比較法です。実際に、機能は、方法は、実装インスタンスに依存して等しい方法、事実話すに等しい静的の含有量は、2つのステップにおいて方法を等しい:まず、二つの同一のオブジェクト(==)かどうかをチェックし、次に引数オブジェクトのインスタンスのいずれかを呼び出します二つのオブジェクトが同一であるかどうかを決定するための方法に等しいです。
ご注意ください
値と基準タイプについて、二つの同一のオブジェクト(==)の概念が異なるかどうかをチェックします。参照型のために、そのようなチェックは、参照が等しいことをいうかどうか、および値型のために、検査がコンテンツに対して行われます。
送信機を使用して、それが明瞭に見ることができる静的メソッドは、コードを等しいです。
パブリック静的ブール値は、(オブジェクトOBJA、オブジェクトobjB)に等しい { リターン((OBJA == objB)||(((OBJA = NULL)&&(objB = NULL))&&(objA.Equals(objB)));! }
私は以前に分析され、最初の方法を使用すると、パラメータオブジェクトは、その後、検査ヌル参照等しいかどうかを確認する==オペレータに等しく、インスタンスメソッドを比較EQUALS呼び出します。そのような機能は、その全部の実装に依存実装読者が非表示静的する必要がないので、インスタンスメソッドを等しい方法に等しく、しかし即時インスタンスメソッド対等に焦点を当てるべきです。
3、インスタンスメソッド:equalsメソッドから比較の仕事のほとんどをした、実際に等しいが、それは仮想インスタンスメソッドで、カスタムの比較を構築する必要がある、あなたは記述する必要があります。以下は、デフォルトメソッドがオブジェクトに実装等しい示す、のMscorlib.dll中間コードです。
ルックスは非常に簡単で、コールInternalEqualsメソッド2つのオブジェクトが等しいのメモリアドレスを確認するには、ある、デフォルトでは実装が等しい比較するための参照です等しいです。著者は、前の章で紹介された、いくつかのケースで比較基準は実用的ではない、とコンテンツがより多くのビジネスロジックのニーズに沿ったものである可能性が高い、とこの時、私たちは、インスタンスから、自分のタイプを書くためにプログラマーを必要とする方法と同じです。実際には、すべての値の型は、オーバーライド基本クラスのValueTypeの例では、equalsメソッドを持っています。次のコードは、書き換え可能な一例です。
システムが使用して、 名前空間のTestOverrideEquals { クラスOverrideEquals { 静的な無効メイン() { MyObjectにはMyObjectに新しい新しいO1 =(10、「私は、文字列だ」); MyObjectにMyObjectに新しい新しいO2 =(10、「私は、文字列だ」); //印刷比較基準 Console.WriteLineを( "比較基準:{0}"、Object.ReferenceEquals(O1、O2).ToString()); //印刷比較結果 Console.WriteLineを(「カスタマイズされたコンテンツの比較:{0} 」o1.Equals(O2).ToString()); Console.Read(); } } クラスMyObjectに { プライベートINT _MyInt; プライベート文字列_MyString。 パブリックMyObjectに(){} MyObjectに公開(I int型、文字列S) { _MyInt = I; _MyString = S; } 公共BOOLオーバーライドに等しい(オブジェクトobj) { //チェックヌル参照 IF(OBJ == NULL) { falseに戻り; } //は比較基準を行います2つの参照が同じであるか、それが結合されたコンテンツが同じである 場合には(Object.ReferenceEquals(これは、OBJ)) { trueに戻り; } //チェック両方のタイプが等しい場合 //実行時の型はMyObjectにできない場合があり、遺伝の影響を検討 //使用反射は正確さを保証するために、犠牲性能の正確な型を取得するよう であれば(this.GetType()!= obj.GetType ()) { 偽に戻る; } //コンテキスト達成 MyObjectにASをMyObjectにOBJ =右; IF(_MyInt right._MyInt && == //文字列型であるが、しかし同等コンテンツ==達成するために、参照型である _MyString == right._MyString)を { 真の復帰に; } falseに復帰; } } }
上記のコードでは、MyObjectに書き換えSystem.Objectのインスタンスはコンテンツの比較に実装される方法を、等しいです。実装は、この結果を得ることができます:
ご注意ください
書き込みからMyObjectには、equalsメソッドが、後の章で説明されるように、潜在的な落とし穴がありますそうするGetHashCodeメソッドをオーバーライドしていないため、上記のコードが警告を生成しますコンパイルします。
答え
参照比較を達成するための静的メソッドも参照。静的インスタンスは、比較的効率的な機能を実現する方法を等しいメソッド呼び出しに相当します。例としては、メソッドが仮想メソッドで等しく、デフォルトの実装では、タイプ・インスタンスが必要に応じてメソッドをオーバーライドすることができる等しく、参照型です。ValueTypeに値型の基本クラスのオーバーライドメソッドは、内容の比較を実現等しいです。