Csharp-indexers

提供:Dev Guides
移動先:案内検索

C#-インデクサー

*indexer* を使用すると、配列などのオブジェクトにインデックスを付けることができます。 クラスのインデクサーを定義すると、このクラスは*仮想配列*と同様に動作します。 その後、配列アクセス演算子([])を使用してこのクラスのインスタンスにアクセスできます。

構文

一次元のインデクサーには、次の構文があります-

element-type this[int index] {

  //The get accessor.
   get {
     //return the value specified by index
   }

  //The set accessor.
   set {
     //set the value specified by index
   }
}

インデクサーの使用

インデクサーの動作の宣言は、ある程度プロパティに似ています。 プロパティと同様に、インデクサーの定義には get および set アクセサーを使用します。 ただし、プロパティは特定のデータメンバーを返すか設定しますが、インデクサーはオブジェクトインスタンスから特定の値を返すか設定します。 つまり、インスタンスデータを小さなパーツに分割し、各パーツにインデックスを付け、各パーツを取得または設定します。

プロパティを定義するには、プロパティ名を指定する必要があります。 インデクサーは名前ではなく、オブジェクトインスタンスを参照する this キーワードで定義されます。 次の例は、概念を示しています-

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.";
      }
      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;
            }
         }
      }
      static void Main(string[] args) {
         IndexedNames names = new IndexedNames();
         names[0] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";

         for ( int i = 0; i < IndexedNames.size; i++ ) {
            Console.WriteLine(names[i]);
         }
         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.

オーバーロードされたインデクサー

インデクサーは過負荷になる可能性があります。 インデクサーは複数のパラメーターで宣言することもでき、各パラメーターは異なるタイプである場合があります。 インデックスが整数である必要はありません。 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.";
         }
      }
      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;
            }
         }
      }

      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] = "Zara";
         names[1] = "Riz";
         names[2] = "Nuha";
         names[3] = "Asif";
         names[4] = "Davinder";
         names[5] = "Sunil";
         names[6] = "Rubic";

        //using the first indexer with int parameter
         for (int i = 0; i < IndexedNames.size; i++) {
            Console.WriteLine(names[i]);
         }

        //using the second indexer with the string parameter
         Console.WriteLine(names["Nuha"]);
         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

Zara
Riz
Nuha
Asif
Davinder
Sunil
Rubic
N. A.
N. A.
N. A.
2