私はいくつかの記事で読んだことがあります
IEquatable を使用した参照型の場合、キャストの使用を減らす
誰かが説得力のある例を親切に提供できますか。
私はいくつかの記事で読んだことがあります
IEquatable を使用した参照型の場合、キャストの使用を減らす
誰かが説得力のある例を親切に提供できますか。
ダリオの説明の後に簡単な例を追加するだけです:
class Person : IEquatable<Person>
{
public string Name { get; set; }
public override bool Equals(object obj)
{
if (obj is Person)
{
Person other = (Person)obj;
// check equality
}
return base.Equals(obj);
}
#region IEquatable<Person> Members
public bool Equals(Person other)
{
// check equality without cast
}
#endregion
}
注: これは、これがcast
. 正しい実装については、ドキュメントを確認してください。
IEquatable<(Of <(T>)>) を実装する場合は、Object..::.Equals(Object) および GetHashCode の基本クラスの実装もオーバーライドして、それらの動作が IEquatable<(Of の動作と一致するようにします。 <(T>)>)..::.Equals メソッド
この記事を知っていますか?それは言う
独自の実装が必要な場合は、このメソッドをオーバーライドできます。EqualsメソッドにはObject型のパラメーターがあるため、クラス固有のメンバーにアクセスできるようにするには、キャストが必要になります。
ここでIEquatableインターフェイスが登場します。IEquatableは.NET2.0の新しい汎用インターフェイスであり、System.Object.Equalsメソッドと同じことを実行できますが、キャストを実行する必要はありません。したがって、このインターフェイスを実装すると、キャストの数を減らすことができます。これは、パフォーマンスにとって良いことです。特にジェネリックコレクションで多くの作業を行う場合、ジェネリックコレクションは一部のメソッド(List.Equals()、List.IndexOf()、List.LastIndexOf()、...)でこの等式比較を利用するためです。
ジェネリック型パラメーターにより、IEquatable<T>
コンパイル時に型チェックを提供できるため、sをキャストして遅延バインディングする必要はありませんobject
。
あなたの答えはここにあると思います、http://msdn.microsoft.com/en-us/library/ms131190.aspx。ページの備考欄をお読みください。