インデクサ
Visual Studio IDE や Visual Studio Code では、以下のようなコードスニペットが用意されている。
indexer : get,setアクセサを持つ標準的なインデクサ
C#においては、クラスおよび構造体の内部にインデクサを持つことができる。
インデクサはthis[添え字リスト]の形式で宣言する。
インデクサの構文内ではget/setが、setアクセサ内ではvalueがそれぞれ文脈キーワードとして機能する。
呼び出し側では、配列にアクセスするような構文でインデクサの機能を呼び出す。
通常のメソッドと異なり、代入を伴わないインデクサメソッドの呼び出しは行えない。下記のような呼び出しは構文エラーとなる他、戻り値void型のインデクサを定義することもできない。ただし、インデクサを介して呼び出したオブジェクトのメンバを呼び出すような場合は構文上問題ない。
言語仕様に配列を持つプログラミング言語の多くは、配列要素にアクセスするための添字による特殊な構文を持つ。例えばC言語から派生した言語では、添え字演算子[]により要素アクセスできる。以下はC#の例である。
その一方で、例えば動的配列 (配列リスト) や辞書 (連想配列) などのように、(言語組み込みの)配列以外のデータ構造を持つコレクションオブジェクトの要素に対しても、配列のように添え字でアクセスできると便利かつ直感的である。
インデクサがない言語では通常getterやsetterと呼ばれる要素アクセスのためのメソッドを実装したり、内部の配列をプロパティとして公開するなどしてアクセスするのが一般的であるが、以下の問題点がある。
コードの冗長化による可読性や直感性の低下
言語によってはgetやsetが識別子として扱われている場合があり、アクセサメソッドの名前が冗長化しやすい
内部配列(実装)を外部に公開するようなパターンは(カプセル化の観点から)そもそも避けるべきである
インデクサを用いることでオブジェクト内のコレクション要素へのアクセスを、配列へのアクセスと同様に記述できる。
ただし、インデクサは実質的にはgetter/setterメソッド呼び出しの糖衣構文であり、インデクサそのものは当然ながら反復子としての機能は持たない。インデクサを記述したからといって配列のようにforeach文などの反復構文がそのまま使えるわけではない他、メソッド呼び出しのオーバーヘッド減少などの効果も特にない(コンパイラによるインライン展開等は当然受けるが、インデクサ固有の利点ではない)。
プログラミング言語C#のインデクサはC++の添え字演算子の多重定義と似ているが、次のような点で発展したものだと見ることもできる。