ホームに戻る
出典 :
連載:C#入門 第12回 インデクサとプロパティ(1/4) - @IT インデクサー - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
関連 :
プロパティ オブジェクト初期化子とinitアクセサ コレクション
目次 :

インデクサー(indexer)

インデクサーはプロパティの一種で、添字(インデクス)によるアクセスを提供する仕組みである。
即ちインデクサーを用いることで、当該オブジェクトに対する配列と同様のアクセスが可能となる。
これはC++における、添字演算子のオーバーライドと同等の機能である。
とりわけユーザ定義クラスがコレクションをメンバとして含む場合に、コレクションの要素を抽出、または更新する際に用いることが主用途であるが、
添字演算子のオーバーライドと同様定義に制限は無く、異なる処理を実装することも可能である。(これはプロパティも同様。)
尚、添字付きプロパティとは別の機能である。

インデクサーの実装

// 添字の上下限を指定できる配列を有するクラス class BoundArray { int[] array; //< 配列の本体 int lower; //< 配列添字の下限 // コンストラクタ public BoundArray(int lower, int upper) { this.lower = lower; array = new int[upper - lower + 1]; } // インデクサー public int this[int i] { get { return this.array[i - lower]; } //< getter set { this.array[i - lower] = value; } //< setter } } // プログラム本体 class Program { static void Main() { // BoundArray のインスタンス生成 BoundArray a = new BoundArray(1, 9); for (int i = 1; i <= 9; ++i) { // インデクサーにアクセス (set) a[i] = i; } for (int i = 1; i <= 9; ++i) { // インデクサーにアクセス (get) Console.WriteLine($"a[{i}] = {a[i]}"); } } }
インデクサーは上記のように this[添字] の形式で定義し、アクセスする際はオブジェクトに添字を付与する。
インデクサーはプロパティと同様、実態はメソッドであるため、添字変数のチェックを実装することで安全配列を実現することも可能である。

インデクサーに複数の添字を用いて多次元のコレクションを扱うこともできる。
// 多次元配列を有するクラス class Matrix { // 配列の本体 int[][] array; // コンストラクタ public Matrix(int rows, int cols) { this.array = new int[rows][]; for (int i = 0; i < rows; ++i) { this.array[i] = new int[cols]; } } // インデクサー public int this[int i, int j] { get { return this.array[i][j]; } set { this.array[i][j] = value; } } }
また、インデクサーの添字引数は数値である必要は無く、任意の型を「キー値」として設定できる
これは Dictionary 等の連想配列をメンバとして保有する場合や、連想配列を自作する際に有用である。