宣言の仕方は、次のように行います。
要素のデータ型 this[int index1, int index2,...]{}では、早速2次元の場合のサンプルをみてみましょう。
// mindexer01.cs using System; class MyClass { int[,] array; public int this[int x, int y] { get { return array[x, y]; } set { array[x, y] = value; } } public MyClass(int a, int b) { array = new int[a, b]; } } class mindexer01 { public static void Main() { MyClass mc = new MyClass(4, 4); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { mc[i, j] = i + j; } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { Console.WriteLine("{0} + {1} = {2}", i, j, mc[i, j]); } } } }使い方は1次元の時と全く同じです。
実行結果は次のようになります。
もちろん、多次元インデクサでもインデックスにint型以外のものを使えます。
次の例は、インデックスにstring型とint型を使ったかなり変なプログラムです。 (なお、このプログラムの地名や市外局番は架空のものです)
// mindexer02.cs using System; class MyTelephone { public string this[string address, int phone] { get { switch (address) { case "北海道": switch (phone) { case 166: return "旭川市"; case 11: return "札幌市"; default: return "知りません"; } case "東京都": switch (phone) { case 3: return "23区"; case 422: return "小金井市"; default: return "知りません"; } default: return "知りません"; } } } } class mindexer02 { public static void Main() { string strFormat = "{0}で市外局番が{1}は{2}です"; MyTelephone mt = new MyTelephone(); Console.WriteLine(strFormat, "東京都", 3, mt["東京都", 3]); Console.WriteLine(strFormat, "北海道", 166, mt["北海道", 166]); Console.WriteLine(strFormat, "九州", 114, mt["九州", 114]); } }これは、変なプログラムですね。まさか、インデクサに電話帳みたいなことをさせるとは あまり思いつく人はいないでしょう。
実行結果は次のようになります。
Update 07/Sep/2006 By Y.Kumei