Индексаторы можно создавать и для многомерных массивов. В качестве примера ниже приведен двумерный отказоустойчивый массив. Обратите особое внимание на объявление индексатора в этом примере.
// Двумерный отказоустойчивый массив.
using System;
class FailSoftArray2D {
int[,] a; // ссылка на базовый двумерный массив
int rows, cols; // размеры массива
public int Length; // открытая переменная длины массива
public bool ErrFlag; // обозначает результат последней операции
// Построить массив заданных размеров,
public FailSoftArray2D(int r, int с) {
rows = r; cols = с;
a = new int[rows, cols];
Length = rows * cols;
}
// Это индексатор для класса FailSoftArray2D.
public int this[int index1, int index2] {
// Это аксессор get.
get {
if(ok(index1, index2)) {
ErrFlag = false;
return a[index1, index2];
}
else
{
ErrFlag = true;
return 0;
}
}
// Это аксессор set.
set {
if(ok(index1, index2)) {
a[index1, index2] = value;
ErrFlag = false;
}
else
ErrFlag = true;
}
}
// Возвратить логическое значение true, если
// индексы находятся в установленных пределах,
private bool ok(int index1, int index2) {
if (index1 >= 0 & index1 < rows & index2 >= 0 &
index2 < cols) return true;
return false;
}
}
// Продемонстрировать применение двумерного индексатора,
class TwoDIndexerDemo {
static void Main() {
FailSoftArray2D fs = new FailSoftArray2D(3, 5);
int x;
// Выявить скрытые сбои.
Console.WriteLine("Скрытый сбой.");
for (int i=0; i < 6; i++) fs[i, i]=i*10;
for(int i=0; i < 6; i++) {
x = fs[i, i] ;
if(x != -1) Console.Write (x + " ");
}
Console.WriteLine();
// А теперь показать сбои.
Console.WriteLine("\nСбой с уведомлением об ошибках.");
for(int i=0; i < 6; i++) {
fs[i,i] = i * 10;
if(fs.ErrFlag)
Console.WriteLine("fs[" + i + ", " + i + "] вне границ");
}
for(int i=0; i < 6; i++) {
x = fs[i, i] ;
if(!fs.ErrFlag)
Console.Write(x + " ");
else
Console.WriteLine("fs[" + i + ", " + i + "] вне границ");
}
}
}
Вот к какому результату приводит выполнение этого кода:
Скрытый сбой.
0 10 20 0 0 0
Сбой с уведомлением об ошибках.
fs[3, 3] вне границ
fs[4, 4] вне границ
fs[5, 5] вне границ
0 10 20 fs[3, 3] вне границ
fs[4, 4] вне границ
fs[5, 5] вне границ
Свойства
Еще одной разновидностью члена класса является