インデクサは、オブジェクトを配列のように扱うことができます。
メソッドやプロパティは static にすることができましたが、インデクサではせきません。
- データ型 this [ int Index , .... ]
{
get
{
return メンバ変数名[index];
}
set
{
メンバ変数名[index] = value;
}
}
インデクサには見ての通り名前がありません。その代わり this が使用されています。
この this の隣にはパラメータが指定されていますが、データ型は int 型以外にも様々な型が使用できます。
パラメータは、複数宣言することもでき、2次元の配列を扱いたいときに使用します。
get/set アクセサはプロパティと同様の扱いなので、ここでは詳しく触れません。
プロパティは名前で識別されていましたが、インデクサはシグネチャで識別されます。
シグネチャで識別されるということは、オーバーロードすることが可能です。
しかし、MSDNでは 「インデクサはオーバーロードできません。」 と記述されていました。
(これは誤訳だったようです。)
より詳しく知りたい方は ここ を参照してください。
//サンプル39
using System;
using System.Collections;
namespace ConsoleApplication
{
class IndexerSample
{
private int[] age;
private Hashtable name = new Hashtable(); // 連想配列
public int this[int index]
{
get
{
return age[index];
}
set
{
if (value >= 0) this.age[index] = value;
}
}
public string this[string nm]
{
get
{
return (string)name[nm]; // string 型にキャスト
}
set
{
name[nm] = value;
}
}
public IndexerSample(int i) // コンストラクタ
{
age = new int[i];
}
}
class Sample39
{
public static void Main()
{
int[] age = {20,22,23};
string[] name = {"toro","momiji","nobu"};
IndexerSample obj = new IndexerSample( age.Length );
for (int i =0; i < age.Length; i++)
{// シグネチャのあったインデクサが呼び出されます。
obj[i] = age[i]; // パラメータが int 型のインデクサが呼び出されます。
}
foreach (string s in name)
{
obj[s] = s; // パラメータが string 型のインデクサが呼び出されます。
}
// ****** 値の確認 ******
for (int i =0; i < age.Length; i++)
{
Console.WriteLine("私は {0} 歳です。", obj[i]);
}
foreach (string s in name)
{
Console.WriteLine("名前は {0} です。", obj[s]);
}
}
}
}