C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のオーバーロードされたインデクサーとは?基本から実装例まで解説

C#におけるインデクサー(indexer)は、オブジェクトを配列のようにインデックスでアクセスできるようにする機能です。クラスにインデクサーを定義すると、そのクラスは仮想的な配列のように振る舞い、[ ](配列アクセス演算子)を使ってインスタンスにアクセスできるようになります。

インデクサーのオーバーロードとは

インデクサーはオーバーロード(多重定義)が可能です。つまり、同じクラス内に複数のインデクサーを宣言でき、それぞれ異なるパラメータの型や数を持たせることができます。例えば、int型のインデックスで要素を取得するインデクサーと、string型の名前からインデックスを検索するインデクサーを、同一クラスに共存させることが可能です。

以下は、C#でオーバーロードされたインデクサーを実装した具体例です。

コード例

using System;
namespace IndexerApplication {
    class IndexedNames {
        private string[] namelist = new string[size];
        static public int size = 10;

        public IndexedNames() {
            for (int i = 0; i < size; i++) {
                namelist[i] = "N. A.";
            }
        }

        // 1つ目のインデクサー:int型のインデックスを受け取る
        public string this[int index] {
            get {
                string tmp;
                if( index >= 0 && index <= size-1 ) {
                    tmp = namelist[index];
                } else {
                    tmp = "";
                }
                return ( tmp );
            }
            set {
                if( index >= 0 && index <= size-1 ) {
                    namelist[index] = value;
                }
            }
        }

        // 2つ目のインデクサー:string型の名前を受け取る(オーバーロード)
        public int this[string name] {
            get {
                int index = 0;
                while(index < size) {
                    if (namelist[index] == name) {
                        return index;
                    }
                    index++;
                }
                return index;
            }
        }

        static void Main(string[] args) {
            IndexedNames names = new IndexedNames();
            names[0] = "John";
            names[1] = "Joe";
            names[2] = "Graham";
            names[3] = "William";
            names[4] = "Jack";
            names[5] = "Tom";
            names[6] = "Tim";

            // int型パラメータのインデクサーを使用
            for (int i = 0; i < IndexedNames.size; i++) {
                Console.WriteLine(names[i]);
            }

            // string型パラメータのインデクサーを使用
            Console.WriteLine(names["Nuha"]);
            Console.ReadKey();
        }
    }
}

実行結果

John
Joe
Graham
William
Jack
Tom
Tim
N. A.
N. A.
N. A.
10

コードのポイント

  • this[int index]:通常の配列のように、整数のインデックスで名前を読み書きできます。範囲外のアクセスに対しては空文字列を返すなど、安全策も組み込まれています。
  • this[string name]:文字列(名前)を渡すと、その名前がリスト内のどの位置にあるかを検索してインデックスを返します。この例では「Nuha」は存在しないため、ループ終了時の値「10」が返されます。
  • このようにパラメータの型が異なるインデクサーを複数定義することで、ひとつのクラスに柔軟なアクセス手段を提供できます。

オーバーロードされたインデクサーを活用すれば、コレクション操作をより直感的かつ読みやすく記述でき、クラス設計の表現力が大きく向上します。

  1. C#のコンテキストキーワードとは?意味と一覧をわかりやすく解説

    C#のコンテキストキーワードとはC#では、コード内で使用される文脈(コンテキスト)によって特別な意味を持つ識別子が存在します。代表的な例が、プロパティのアクセサーとして使われる「get」や「set」です。このように、特定の場面でのみキーワードとして機能する語を「コンテキストキーワード」と呼びます。コンテキストキーワードは、通常の予約語(class や int など)とは異なり、常に予約されているわけではありません。そのため、変数名やメソッド名などの識別子としても自由に使用できるのが大きな特徴です。コンテキストキーワードの一覧以下は、C#で定義されている主なコンテキストキーワードの一覧です。コン

  2. C#のConditional属性(条件付き属性)とは?基本構文と使い方を実例で解説

    属性(Attribute)は、プログラムにメタデータを追加するための仕組みです。コンパイラへの指示や、コメント・説明文、メソッドやクラスに関する付加情報などをコードに埋め込むことができます。Conditional属性とはConditional属性は、あらかじめ定義されている属性の一つで、指定したプリプロセッサ識別子(シンボル)が定義されている場合にのみ実行される「条件付きメソッド」をマークします。この属性を使用すると、Debug や Trace など、指定されたシンボルの値に応じてメソッド呼び出しの条件付きコンパイルが行われます。たとえば、デバッグ中に変数の値を表示したい場合などに活用できます