Object のパブリック メソッドの説明:
パブリック メソッド:
Equals:
public class Object {
public virtual Boolean Equals(Object obj)
{
//2 つの参照が同じオブジェクトを指している場合、それらは同じ値が含まれている必要があります
if (this == obj) return true;
return false;
}
}
this インスタンスと obj インスタンスが同じオブジェクトを参照していると仮定して、true を返します。 Equals は、オブジェクトにはそれ自体と同じ値が含まれている必要があることを認識しているため、これは合理的であるように思えます。ただし、インスタンスが異なるオブジェクトを参照している場合、Equals はオブジェクトに同じ値が含まれているかどうかがわからないため、false を返します。つまり、Object の Equals メソッドのデフォルト実装では、実際に実装されるのは等価性ではなく同一性です。
Equals メソッドの正しい実装:
1. obj の実パラメータが null の場合、非静的 Equals メソッドを呼び出すときは、明らかにこれによって識別される現在のオブジェクトを null にすることはできないため、false を返します
2。および obj 実際のパラメータが同じオブジェクトを参照している場合は、true を返します。この手順は、多数のフィールドを含むオブジェクトを比較する場合のパフォーマンスの向上に役立ちます。 3. this 引数と obj 引数が異なるタイプのオブジェクトを参照する場合は、false を返します。文字列オブジェクトは明らかに FileStream オブジェクトと等しくありません
4. 型によって定義された各フィールドについて、このオブジェクトの値と obj オブジェクトの値を比較し、等しくないフィールドがある場合は false を返します
5。基本クラスの Equals メソッドを呼び出して、それによって定義されたフィールドを比較します。基本クラスの Equals メソッドが false を返す場合は false を返し、それ以外の場合は true を返します
注:
アイデンティティの問題のテストでは、次のメソッドが使用されます。 Object の静的メソッド ReferenceEquals。プロトタイプは次のとおりです。
public static Boolean ReferenceEquals(Object objA, object objB)
{
return (objA==objB);
}
ID の問題を確認します ( 2 つの参照が同じオブジェクトを指しているかどうかを確認してください)。 ReferenceEquals を呼び出すときは、特定のオペランドの型がオーバーロードされる可能性があるため、C# の == 演算子を使用しないでください (両方のオペランドが最初に Object に変換されない限り)。 == 演算子であり、それに割り当てられる値は、identity とは異なるセマンティクスを持ちます。
システム。 ValueType (すべての値型の基本クラス) は、Object の Equals メソッドをオーバーライドし、(同一性チェックの代わりに) 値の等価性チェックを実行するための正しい実装を実装します。 ValueType の Equals の内部実装は次のとおりです:
1, if If obj の実パラメータが null の場合、false を返します
2。 this と obj の実パラメータが異なる型のオブジェクトを参照している場合は、false を返します
3。その型によって定義された各インスタンス フィールドについて、このオブジェクトの値を obj の値と比較します。内のオブジェクトが (ID チェックの代わりに) 比較されます。 ValueType の Equals の内部実装は次のとおりです:
1、obj 実パラメータが null の場合、false を返します
2、このパラメータと obj 実パラメータが異なる型のオブジェクトを参照している場合、false を返します
3、 type 各インスタンス フィールドについて、このオブジェクトの値が obj オブジェクトの値と比較されます (フィールドの equals メソッドを呼び出すことで)。等しくないフィールドがある場合は false
4 が返され、true が返されます。返される。 ValueType の Equals メソッドは Object の Equals メソッドを呼び出しません
内部的には、ValueType の Equals メソッドはリフレクションを使用して上記の手順 3 を完了します。CLR リフレクション メカニズムが遅いため、独自の値の型を定義する場合は Equals をオーバーライドする必要があります。メソッドを使用して独自の実装を提供することで、等価性比較のための独自の型のパフォーマンスを向上させることができます。もちろん、実装では、base.Equals を呼び出しません。
注:
独自の型を定義する場合、オーバーライドされた Equals は、等価性の 4 つの特性
1、Equalse は再帰的でなければなりません: x.Equals(x) は true を返さなければなりません
2、Equals は対称でなければなりません: x.Equals(y) と y.Equals(x) は同じ値を返します
3、Equals は推移的である必要があります: x.Equals(y) が true を返し、y.Equals(z) が true を返すと、x.Equals(z) は必ず true を返します
4、Equals は一貫性がある必要があります。 2 つの値の比較は変更されず、Equals の戻り値も変更されません
GetHashCode:
定義したクラスが Equals メソッドをオーバーライドする場合、GetHashCode メソッドもオーバーライドする必要があります。この要件の理由は、System.Collections.Hashtable 型、System.Collection.Generic.Dictionary 型、およびその他のコレクションの実装では、2 つのオブジェクトが等しいとみなされるために同じハッシュ コードを持つ必要があるためです。したがって、Equals を書き換える場合は、等価アルゴリズムとオブジェクト ハッシュ コード アルゴリズムの一貫性を確保するために GetHashCode を書き換える必要があります。簡単に言うと、キーと値のペアをコレクションに追加するには、まずオブジェクトのハッシュ コードを取得する必要があります。ハッシュ コードは、キーと値のペアをどのハッシュ バケットに保存するかを示します。コレクションがキーを検索する必要がある場合、指定されたキー オブジェクトのハッシュ コードを取得します。これにより、順次検索されるハッシュ バケットが識別され、指定されたキー オブジェクトと等しいキー オブジェクトが検索されます。 。このアルゴリズムを使用してキーを保存および検索すると、コレクション内のキー オブジェクトが変更されると、コレクションはそのオブジェクトを見つけることができなくなります。したがって、ハッシュ テーブル内のキー オブジェクトを変更する必要がある場合、正しいアプローチは、元のキー/値のペアを削除し、キー オブジェクトを変更してから、新しいキー/値のペアをハッシュ テーブルに追加し直すことです。
GetHashCode メソッドのカスタマイズは難しくないかもしれませんが、データの種類とデータの分布によって異なります。例とルールを以下に示します:
内部シールクラス Point
{
private readonly Int32 m_x, m_y;
public override int GetHashCode()
{
return m_x ^ m_y //m_xとm_yのXOR結果を返す
}
;
ルール:
1. ハッシュ テーブルが最高のパフォーマンスを達成できるように、このアルゴリズムは適切なランダム分散を提供する必要があります。
2. 蓄積された GetHashCode メソッドをアルゴリズム内で呼び出し、その戻り値を含めることができます。ただし、通常は Object または ValueType の GetHashCode メソッドを呼び出さないでください。両方の実装は高性能ハッシュ アルゴリズムとは何の関係もないためです
3. アルゴリズムの実行速度は可能な限り高速である必要があります
4。同じ値は同じハッシュ値を返す必要があります。たとえば、同じテキストを含む 2 つの文字列オブジェクトは、同じハッシュ コード
5 を返します。System.Object によって実装された GetHashCode メソッドは、派生型やその他のフィールドについて何も知らないため、存続期間中に変更されないことが保証されている値を返します。オブジェクトのシリアル番号。
ToString:
デフォルトの戻り値の型はフルネーム (this.GetType().FullName) です。
GetType:
Type から派生した型のインスタンスを返し、GetType が呼び出されたときのオブジェクトの型を示します。返された Type オブジェクトをリフレクション クラスで使用して、オブジェクトのタイプに関連するメタデータ情報を取得できます。さらに、GetType は非仮想メソッドです。その目的は、クラスがメソッドをオーバーライドしてエンタープライズ タイプを隠蔽し、それによってタイプ セーフが破壊されるのを防ぐことです。
保護されたメソッド:
MemberwiseClone:
この非仮想メソッドは、クラスの新しいインスタンスを作成し、静的オブジェクトのインスタンス フィールドをこのオブジェクトのインスタンス フィールドとまったく同じに設定します。新しいインスタンスへの参照を返します。
Finalize:
この仮想メソッドは、オブジェクトがガベージとしてリサイクルされるとガベージ コレクターが判断した後、オブジェクトのメモリが実際にリサイクルされる前に呼び出されます。リサイクル前にクリーンアップ作業を実行する必要があるタイプは、このメソッドをオーバーライドする必要があります。
以上がSystem.Object とは何ですか? System.Object の使用方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。