インデクサー (C# プログラミング ガイド)Indexers (C# Programming Guide)

インデクサーを使用すると、配列と同じようにクラスまたは構造体のインスタンスにインデックスを作成することができます。Indexers allow instances of a class or struct to be indexed just like arrays. インデックス値は、型またはインスタンス メンバーの明示的な指定なしで設定または取得できます。The indexed value can be set or retrieved without explicitly specifying a type or instance member. インデクサーはプロパティと似ていますが、そのアクセサーがパラメーターを取る点が異なります。Indexers resemble properties except that their accessors take parameters.

次の例は、値の割り当てと取得を行う単純な get アクセサー メソッドと set アクセサー メソッドを持つジェネリック クラスを定義します。The following example defines a generic class with simple get and set accessor methods to assign and retrieve values. Program クラスは、文字列の格納用にこのクラスのインスタンスを作成します。The Program class creates an instance of this class for storing strings.

using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];

   // Define the indexer to allow client code to use [] notation.
   public T this[int i]
   {
      get { return arr[i]; }
      set { arr[i] = value; }
   }
}

class Program
{
   static void Main()
   {
      var stringCollection = new SampleCollection<string>();
      stringCollection[0] = "Hello, World";
      Console.WriteLine(stringCollection[0]);
   }
}
// The example displays the following output:
//       Hello, World.

注意

その他の例については、「関連セクション」を参照してください。For more examples, see Related Sections.

式の本文の定義Expression Body Definitions

通常は、インデクサーの get または set アクセサーは、値を返すか値を設定する単一のステートメントで構成します。It is common for an indexer's get or set accessor to consist of a single statement that either returns or sets a value. 式の本文のメンバーは、このシナリオをサポートする簡略化された構文を提供します。Expression-bodied members provide a simplified syntax to support this scenario. C# 6 以降、読み取り専用インデクサーは、次の例のように、式の本文のメンバーとして実装することができます。Starting with C# 6, a read-only indexer can be implemented as an expression-bodied member, as the following example shows.

using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];
   int nextIndex = 0;
   
   // Define the indexer to allow client code to use [] notation.
   public T this[int i] => arr[i];
   
   public void Add(T value)
   {
      if (nextIndex >= arr.Length) 
         throw new IndexOutOfRangeException($"The collection can hold only {arr.Length} elements.");
      arr[nextIndex++] = value;
   }
}

class Program
{
   static void Main()
   {
      var stringCollection = new SampleCollection<string>();
      stringCollection.Add("Hello, World");
      System.Console.WriteLine(stringCollection[0]);
   }
}
// The example displays the following output:
//       Hello, World.

式の本文は => で導入され、get キーワードは使用されないことに注意してください。Note that => introduces the expression body, and that the get keyword is not used.

C# 7.0 以降、get アクセサーと set アクセサーのどちらも、式の本文のメンバーとして実装できます。Starting with C# 7.0, both the get and set accessor can be an implemented as expression-bodied members. この場合、get キーワードと set キーワードの両方を使用する必要があります。In this case, both get and set keywords must be used. 例:For example:

using System;

class SampleCollection<T>
{
   // Declare an array to store the data elements.
   private T[] arr = new T[100];

   // Define the indexer to allow client code to use [] notation.
   public T this[int i]
   {
      get => arr[i]; 
      set => arr[i] = value; 
   }
}

class Program
{
   static void Main()
   {
      var stringCollection = new SampleCollection<string>();
      stringCollection[0] = "Hello, World.";
      Console.WriteLine(stringCollection[0]);
   }
}
// The example displays the following output:
//       Hello, World.

インデクサーの概要Indexers Overview

  • インデクサーを使用すると、配列と同じようにオブジェクトにインデックスを作成することができます。Indexers enable objects to be indexed in a similar manner to arrays.

  • get アクセサーは値を返します。A get accessor returns a value. set アクセサーは値を割り当てます。A set accessor assigns a value.

  • this キーワードは、インデクサーの定義に使用されます。The this keyword is used to define the indexer.

  • value キーワードは、set インデクサーによって割り当てられる値の定義に使用されます。The value keyword is used to define the value being assigned by the set indexer.

  • インデクサーは、整数値でインデックスを指定する必要はありません。個々の検索メカニズムの定義方法によります。Indexers do not have to be indexed by an integer value; it is up to you how to define the specific look-up mechanism.

  • インデクサーはオーバーロードすることができます。Indexers can be overloaded.

  • インデクサーには、2 次元配列にアクセスする場合など、複数の仮パラメーターを指定できます。Indexers can have more than one formal parameter, for example, when accessing a two-dimensional array.

関連セクションRelated Sections

C# 言語仕様C# Language Specification

詳細については、「C# 言語の仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。

参照See Also

C# プログラミング ガイドC# Programming Guide
プロパティProperties