インデクサ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

プログラミング言語におけるインデクサ: indexer) は、クラス構造体インスタンス配列と同様の添え字を指定してアクセスするための構文である。

概要[編集]

プログラミング言語C#のインデクサはC++の添え字演算子の多重定義と似ているが次のような点で発展したものだと見ることもできる。ただしC++とC#の言語設計上の事情も絡んでいるので、単純に比較できるものではない。

  • インデクサではプロパティのように値を得るときと代入するときとで実際には別のメソッドに分かれている。
  • インデクサは単独で多次元な配列を模倣できる。C++で同じようなことをするには間に一時的にオブジェクトを入れるなどの技巧を凝らす必要がある。

他の言語ではC#のインデクサに似た機能として、Visual Basic .NETの引数付きプロパティやC++/CLIのインデックス付きプロパティなどが存在する。

リストを表すコレクションの要素のアクセスでは、インデクサを用いない言語では例えば次のようなインターフェイスメソッドによって定義される。

1) index番目の要素の取り出し

Object get(int index);
例:Object o = list.get(3);

2) index番目の要素に Object o をセット

void set(int index, Object o);
例:list.set(2, o);

C# のインデクサではリストの要素へのアクセスを配列のアクセスと同じように記述することができる。

 object o = list[3];
 list[2] = o;

この際インデックスとして整数以外の値(文字列やオブジェクトなど)も使用することができ、ハッシュテーブルなどの連想配列を表すコレクションに使用されている。

 object o = map["key"];

[編集]

C#[編集]

C#においては、クラスおよび構造体の内部にインデクサを持つことができる。

インデクサはthis[添え字リスト]の形式で宣言する。

インデクサの構文内ではgetsetが、 setアクセサ内では、valueがそれぞれ文脈キーワードとして機能する。

  class TwoByTwoMatrix {

      private int[][] items = new[]{
          new[] { 1, 2 },
          new[] { 3, 4 }
      };

      // セルの値を取得、設定するインデクサ
      public int this[int index0, int index1] {
          get { return items[index0][index1]; }
          set { items[index0][index1] = value; }
      }

  }

呼び出し側では、配列にアクセスするような構文でインデクサの機能を呼び出す。

  var matrix = new TwoByTwoMatrix();
  // setアクセス
  matrix[0, 0] = 10;
  // getアクセス
  int num = matrix[0, 1]
  // get ⇒ 加算 ⇒ set
  matrix[1, 0] += 10;

他言語との相互運用[編集]

他言語との相互運用のため、既定ではItemという名前のインデックス付きプロパティが自動生成される。

System.Runtime.CompilerServices.IndexerNameAttribute属性を付加することで、自動生成されるインデクサの名前を明示的に指定できる。 この機能が利用されている代表的な例として、System.Stringクラスが挙げられる。System.Stringクラスではインデクサの名前はCharsとなるように指定されている。 [1]

スニペット[編集]

Visual Studio IDE や Visual Studio Code では、以下のようなコードスニペットが用意されている。

  • indexer : get,setアクセサを持つ標準的なインデクサ

Visual Basic (.NET)[編集]

Visual Basic においては、Defaultキーワード付きのインデックス付きプロパティがインデクサとしてアクセス可能となる。

Public Class StringArray
    Private m_Item As String() = New String(10) {}
    ' Defaultが宣言されたインデックス付きプロパティはインデクサとしてアクセス可能
    Default Public Property Item(index As Integer) As String
        Get
            Return m_Item(index)
        End Get
        Set(ByVal value As String)
            m_Item(index) = value
        End Set
    End Property
End Class
  Dim obj As StringArray = New StringArray
  ' getアクセス
  Dim str As String = obj(1)
  ' setアクセス
  obj(2) = str

参考文献[編集]

  1. ^ https://referencesource.microsoft.com/#mscorlib/system/string.cs,8307d03426b56fe1

関連項目[編集]