.NETベースクラスライブラリのいくつかの事前定義インタフェース
6800 ワード
インタフェースは、実は理解しにくいわけではありません.抽象的なメンバーの集合です.そのメンバーはメソッドとプロパティの署名のみであり、具体的な実装はできません.
また、インタフェースのメンバーは修飾子を指定しません(すべてのインタフェースメンバーは共通および抽象的に隠されているため).同じ名前のメンバーを含むインタフェースをクラスまたは構造実装すると、
この場合、ネーミング競合を明示的に解決できます.
大まかなパターンは次のとおりです.
returnType InterfaceName.MethodName(params)
注:明示的に実装されたメンバーは常に自動的にプライベートであるため、アクセス修飾子は提供できません.すなわち、これらの明示的に実装されたメンバーは、対像レベルでは使用できません.
次に、一般的な事前定義インタフェースについて説明します.
一.廃棄可能なタイプの構築
クラスまたは構造がIDisposableインタフェースを提供している場合、オブジェクト・ユーザーがこのオブジェクトを使用しなくなった場合、このオブジェクト参照が役割ドメインから離れる前にDispose()が手動で呼び出されると仮定します.これにより、オブジェクトは必要に応じて実行できます.
の非管理リソース(管理リソースであってもよい)のパージ作業は、終了キュー(Finalize()メソッド)にオブジェクトを置くことによるパフォーマンス損失はなくなり、ゴミ回収器トリガクラスの終了ロジックを待つ必要もありません.
C#のusingキーワードは、このインタフェースのDispose()メソッドを自動的に呼び出すことができます.
二.列挙可能なタイプの構築
GetEnumerator()メソッドをサポートするタイプは、foreach構造で演算できます.これらのインタフェースをカスタムタイプでサポートしたい場合は、上記の各メソッドを手動で実装できますが、これには多くの費用がかかります.
精力.ここではSystemが利用できる.Array(すべての配列のベースクラス)と他の多くのタイプは、システムに簡単に依頼するために、この2つのインタフェースの性質を実現している.Array.
ここでは、反復器の構造について補足して説明します.
foreach列挙をサポートするカスタムセットを構築する場合は、IEnumerableインタフェース(IEnumeratorインタフェースもあるかもしれません)を実装したり、反復器を使用して同じ目的を達成したりすることができます.
反復器は、コンテナ内部のアイテムがforeachで処理されたときにどのように戻るかを指定するメンバーメソッドです.この場合、反復メソッドの名前はGetEnumerator()、戻り値はIEnumeratorタイプでなければなりません.
ただし、カスタムクラスは元のインタフェースを実装する必要はありません.つまり、これらのインタフェースを継承する必要はありません.
反復器は主にyieldキーワードを適用して定義されます.
yield return構文を使用して、呼び出し元にカスタムタイプのオブジェクトを返します.yieldキーワードは、呼び出し元のforeach構造に戻り値を指定するために使用されます.yield return文に達すると、現在の位置が格納され、次回は反復が呼び出されます.
器はこの位置から実行されます.
注:System.ArrayはIEnumerableインタフェースを継続し、すべての配列タイプのベースクラスでもある.このようにして、私たちは結論を得ました.
任意の配列タイプのクラスまたは構造はforeach構文をサポートします.カスタム非配列タイプのクラスまたは構造もforeachをサポートすることを望む場合は、コードを簡略化する目的で配列タイプの関連実装に簡単に委任することができます.
三.クローン可能なオブジェクトの構築
その役割は、呼び出し元に同じコピーを返す能力を自分のカスタムタイプでサポートすることです.
補足:System.Object(スーパー親)には、MemerwiseClone()というメンバーが定義されています.このメソッドは、現在のオブジェクトの浅いレプリケーションを取得するために使用します.保護されているため、オブジェクト・ユーザーはこのメソッドを直接呼び出すことはなく、クローン中にオブジェクトが自分で呼び出す可能性があります.
このインタフェースは、実際の深いレプリケーションをサポートする場合に実現できます.ただし、クローン作成中に各参照タイプ変数の新しいインスタンスを作成する必要があります.
クローン作成プロセスを要約します.
値タイプのみを含むクラスまたは構造がある場合は、MemerwiseClone()を使用してClone()メソッドを実装します.この場合,直接付与の形式に相当する.実際,直接付与は暗黙的にMemerwiseClone()メソッドを呼び出したものである.
他の参照タイプを保存するカスタムタイプがある場合は、各参照タイプのメンバー変数を考慮した新しいオブジェクトを作成する必要があります.
四.比較可能なオブジェクトの構築
特定のキー値に基づいてオブジェクトをソートできる動作を指定します.
System.ArrayクラスはSort()という静的メソッドを定義した.このメソッドをint,short,stringなどの組み込みタイプでアップグレードする場合、これらの組み込みデータタイプがIComparableインタフェースを実現するため、配列内のアイテムを数値またはアルファベット順にソートできます.同様に、カスタムタイプを構築する場合は、このインタフェースを実装してタイプ配列をソートすることもできます.
CompareTo()メソッドの背後にある論理は、入力されたオブジェクトと現在のインスタンスを特定のデータフィールドに基づいて比較することです.戻り値が0より小さい場合、このインスタンスはオブジェクトを指定する前に、0より大きい場合はオブジェクトを指定した後、0に等しい場合はオブジェクトを指定します.
五.複数のソート順の指定
IComparableインタフェースとは異なり、IComparerインタフェースはソートするタイプではなく、多くの補助クラスで実装され、各ソートにはそれぞれ根拠があります.
また、インタフェースのメンバーは修飾子を指定しません(すべてのインタフェースメンバーは共通および抽象的に隠されているため).同じ名前のメンバーを含むインタフェースをクラスまたは構造実装すると、
この場合、ネーミング競合を明示的に解決できます.
大まかなパターンは次のとおりです.
returnType InterfaceName.MethodName(params)
注:明示的に実装されたメンバーは常に自動的にプライベートであるため、アクセス修飾子は提供できません.すなわち、これらの明示的に実装されたメンバーは、対像レベルでは使用できません.
次に、一般的な事前定義インタフェースについて説明します.
一.廃棄可能なタイプの構築
// System
public interface IDisposable
{
void Dispose();
}
クラスまたは構造がIDisposableインタフェースを提供している場合、オブジェクト・ユーザーがこのオブジェクトを使用しなくなった場合、このオブジェクト参照が役割ドメインから離れる前にDispose()が手動で呼び出されると仮定します.これにより、オブジェクトは必要に応じて実行できます.
の非管理リソース(管理リソースであってもよい)のパージ作業は、終了キュー(Finalize()メソッド)にオブジェクトを置くことによるパフォーマンス損失はなくなり、ゴミ回収器トリガクラスの終了ロジックを待つ必要もありません.
C#のusingキーワードは、このインタフェースのDispose()メソッドを自動的に呼び出すことができます.
二.列挙可能なタイプの構築
// System.Collections
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface IEnumerator
{
bool MoveNext(); //
object Current {get;} // ( )
void Reset(); //
}
GetEnumerator()メソッドをサポートするタイプは、foreach構造で演算できます.これらのインタフェースをカスタムタイプでサポートしたい場合は、上記の各メソッドを手動で実装できますが、これには多くの費用がかかります.
精力.ここではSystemが利用できる.Array(すべての配列のベースクラス)と他の多くのタイプは、システムに簡単に依頼するために、この2つのインタフェースの性質を実現している.Array.
public :IEnumerable
{
。。。
public ;
;
public IEnumerator GetEnumerator()
{
// IEnumerator
return .GetEnumerator();
}
}
ここでは、反復器の構造について補足して説明します.
foreach列挙をサポートするカスタムセットを構築する場合は、IEnumerableインタフェース(IEnumeratorインタフェースもあるかもしれません)を実装したり、反復器を使用して同じ目的を達成したりすることができます.
反復器は、コンテナ内部のアイテムがforeachで処理されたときにどのように戻るかを指定するメンバーメソッドです.この場合、反復メソッドの名前はGetEnumerator()、戻り値はIEnumeratorタイプでなければなりません.
ただし、カスタムクラスは元のインタフェースを実装する必要はありません.つまり、これらのインタフェースを継承する必要はありません.
反復器は主にyieldキーワードを適用して定義されます.
public IEnumerator GetEnumerator()
{
yield return [0];
yield return [1];
yield return [2];
yield return [3];
....
// foreach
}
yield return構文を使用して、呼び出し元にカスタムタイプのオブジェクトを返します.yieldキーワードは、呼び出し元のforeach構造に戻り値を指定するために使用されます.yield return文に達すると、現在の位置が格納され、次回は反復が呼び出されます.
器はこの位置から実行されます.
注:System.ArrayはIEnumerableインタフェースを継続し、すべての配列タイプのベースクラスでもある.このようにして、私たちは結論を得ました.
任意の配列タイプのクラスまたは構造はforeach構文をサポートします.カスタム非配列タイプのクラスまたは構造もforeachをサポートすることを望む場合は、コードを簡略化する目的で配列タイプの関連実装に簡単に委任することができます.
三.クローン可能なオブジェクトの構築
using System ;
public interface ICloneable
{
object Clone(); // object
}
その役割は、呼び出し元に同じコピーを返す能力を自分のカスタムタイプでサポートすることです.
補足:System.Object(スーパー親)には、MemerwiseClone()というメンバーが定義されています.このメソッドは、現在のオブジェクトの浅いレプリケーションを取得するために使用します.保護されているため、オブジェクト・ユーザーはこのメソッドを直接呼び出すことはなく、クローン中にオブジェクトが自分で呼び出す可能性があります.
このインタフェースは、実際の深いレプリケーションをサポートする場合に実現できます.ただし、クローン作成中に各参照タイプ変数の新しいインスタンスを作成する必要があります.
クローン作成プロセスを要約します.
値タイプのみを含むクラスまたは構造がある場合は、MemerwiseClone()を使用してClone()メソッドを実装します.この場合,直接付与の形式に相当する.実際,直接付与は暗黙的にMemerwiseClone()メソッドを呼び出したものである.
他の参照タイプを保存するカスタムタイプがある場合は、各参照タイプのメンバー変数を考慮した新しいオブジェクトを作成する必要があります.
四.比較可能なオブジェクトの構築
// System
public interface IComparable
{
int CompareTo(object o);
}
特定のキー値に基づいてオブジェクトをソートできる動作を指定します.
System.ArrayクラスはSort()という静的メソッドを定義した.このメソッドをint,short,stringなどの組み込みタイプでアップグレードする場合、これらの組み込みデータタイプがIComparableインタフェースを実現するため、配列内のアイテムを数値またはアルファベット順にソートできます.同様に、カスタムタイプを構築する場合は、このインタフェースを実装してタイプ配列をソートすることもできます.
CompareTo()メソッドの背後にある論理は、入力されたオブジェクトと現在のインスタンスを特定のデータフィールドに基づいて比較することです.戻り値が0より小さい場合、このインスタンスはオブジェクトを指定する前に、0より大きい場合はオブジェクトを指定した後、0に等しい場合はオブジェクトを指定します.
五.複数のソート順の指定
//
// :System.Collections
interface IComparer
{
int Compare(object o1,object o2);
}
IComparableインタフェースとは異なり、IComparerインタフェースはソートするタイプではなく、多くの補助クラスで実装され、各ソートにはそれぞれ根拠があります.