-
C#でのインデクサーの実装プロセス集
C# 言語の最も興味深い側面の 1 つは、クラス インデクサーです。簡単に言うと、いわゆるインデクサーは、配列のように独自のクラスを参照できる特別なタイプの属性です。明らかに、この機能はコレクション クラスを作成する場合に特に便利ですが、大きなファイルの処理や特定の限られたリソースの抽象化など、他の状況でも、クラス内で配列のような動作を行うことももちろん非常に便利です。この記事では、インデクサーを使用するためのクラスの設定について説明します。まず、必要な背景を提供するために、プロパティの概念の概要を説明しましょう。
プロパティ VB6 でプログラムを作成したことがある場合は、プロパティ メソッドについてよく知っているはずです。いわゆるプロパティ メソッドは、実際にはプライベート クラス フィールドへの制御されたアクセスを実装する特別なクラス メンバーです。 C# 言語には 2 つの属性メソッドがあります。1 つはプライベート フィールドの値を返すことができる get で、もう 1 つはプライベート フィールドの値を設定できる set です。たとえば、次のコードを例にとると、プライベート クラス メンバー firstname へのアクセスを制御するために FirstName プロパティが作成されます。
クラス人 {
プライベート文字列名;
パブリック文字列名 {
get {名を返す;}
{名 = 値;} を設定します
}
}
プロパティ宣言は次のようにエンコードできます。
人 p = 新しい人();
p.FirstName = "ラモント";
Console.WriteLine (p.FirstName);
ご覧のとおり、属性宣言はドメイン宣言に似ていますが、Microsoft によればいわゆるアクセサーである 2 つの特別なメンバーも宣言している点が異なります。 get access 関数は、式の右側でプロパティが呼び出されたとき、またはプロパティが別のサブルーチン (または関数) のパラメーターとして使用されたときに呼び出されます。逆に、式の左側でプロパティが呼び出され、暗黙的に value パラメーターを渡すことによってプライベート フィールド値が設定されると、set access 関数が呼び出されます。 set アクセサー関数を省略して読み取り専用プロパティを作成すると、プロパティを設定しようとするとコンパイル エラーが生成されます。
インデクサーを使用する利点
以下はその構造です
<修飾子> <戻り値の型> this [引数リスト]
...{
得る
...{
// コードの取得はここにあります
}
セット
...{
// ここにコードを設定します
}
}
注記:
修飾子: 修飾子 (プライベート、パブリック、保護、内部など)
this: これは C# の特別なキーワードであり、参照クラスの現在のインスタンスを表します。ここでは、現在のクラスのインデックスを意味します。
引数リスト: これはインデクサーのパラメーターを指します。
長く話したので本題に移りますが、なぜ私がこの堂々巡りをしなければならないのでしょうか?実際、これはクラスのインデクサーがプロパティに非常によく似ているためであり、コードの観点からも同様です。文字列を返すインデクサーを備えたクラスの例を次に示します。
クラスサンプル {
パブリック文字列 this [int インデックス] {
get {return "あなたが渡した" + インデックス }
}
}
ここでの属性名は this であり、クラスの現在のインスタンスを参照しており、パラメーター リストは括弧ではなく角括弧で囲まれていることに注意してください。また、これは読み取り専用のインデクサーです。読み書き型に変更するために、set access関数を追加しました。インデクサーを定義するときは、パラメーターを 1 つだけ取る必要はありません。インデクサー パラメーターは任意の型にすることができますが、通常は int が最も合理的な型です。同じクラス内に複数のインデクサー (オーバーロード) を含めることも可能です。
上記のように Sample クラスを定義した後、以下に示すように、インデクサーをデフォルトの属性として使用できます。
サンプル s = 新しいサンプル();
Console.WriteLine(s[55]);
プロパティとインデクサー プロパティとインデクサーにはいくつかの違いがあります。
クラスの各属性には一意の名前が必要であり、クラス内で定義された各インデクサーには一意のシグネチャまたはパラメーター リストが必要です (インデクサーのオーバーロードを実装できるように)。
プロパティは静的にすることができ、インデクサーはインスタンスのメンバーである必要があります。
インデクサー用に定義されたアクセス関数は、インデクサーに渡されるパラメーターにアクセスできますが、プロパティ アクセス関数にはパラメーターがありません。
インターフェイスの配列のような動作はプログラム実装者によって好まれることが多いため、インターフェイスのインデクサーを定義することもできます。IList コレクション インターフェイスと IDictionary コレクション インターフェイスの両方で、格納されている項目にアクセスするためのインデクサーを宣言します。
インターフェイスのインデクサーを宣言する場合、その宣言はインデクサーの存在を示すだけであることに注意してください。スコープ修飾子を含めずに、適切なアクセス関数を提供するだけで済みます。次のコードは、インデクサーをインターフェイス IImplementMe の一部として宣言します。
インターフェース IIimplementMe {
文字列 this[int インデックス]
{
得る;
セット;
}
対応する実装クラスは、IimplementMe のインデクサーの get および set アクセス関数を具体的に定義する必要があります。
以上がインデクサーの基本的な概要です。これで、開発においてインデクサーが果たす役割をよりよく理解できるようになりました。
クラス SampleCollection<T>
{
プライベート T[] arr = 新しい T[100];
public T this[int i]
{
得る
{
arr[i]を返します;
}
セット
{
arr[i] = 値;
}
}
}
// このクラスは、クライアント コードがインデクサーを使用する方法を示します。
クラスプログラム
{
static void Main(string[] args)
{
SampleCollection<string> stringCollection = new SampleCollection<string>();
stringCollection[0] = "こんにちは、世界";
System.Console.WriteLine(stringCollection[0]);
}
}
この記事は CSDN ブログからのものです。転載する場合は出典を明記してください: http://blog.csdn.net/licheng19891020/archive/2009/12/09/4974516.aspx
-