Преимущество индексатора заключается, в частности, в том, что он позволяет полностью управлять доступом к массиву, избегая нежелательного доступа. В качестве примера рассмотрим программу, в которой создается классFail So f t Array,реализующий массив для выявления ошибок нарушения границ массива, а следовательно, для предотвращения исключительных ситуаций, возникающих во время выполнения в связи с индексированием массива за его границами. Для этого массив инкапсулируется в качестве закрытого члена класса, а доступ к нему осуществляется только с помощью индексатора. При таком подходе исключается любая попытка получить доступ к массиву за его границами, причем эта попытка пресекается без катастрофических последствий для программы. А поскольку в классеFailSof tArrayиспользуется индексатор, то к массиву можно обращаться с помощью обычной формы записи.
// Использовать индексатор для создания отказоустойчивого массива.
using System;
class FailSoftArray {
int[] a; // ссылка на базовый массив
public bool ErrFlag; // обозначает результат последней операции
// Построить массив заданного размера, public FailSoftArray(int size) { a = new irrt [size] ;
Length = size;
}
// Это индексатор для класса FailSoftArray. public int this[int index] {
// Это аксессор get. get {
if (ok(index)) {
ErrFlag = false; return a[index];
} else {
ErrFlag = true; return 0;
}
}
// Это аксессор set. set {
. if(ok(index)) {
a[index] = value;
ErrFlag = false;
}
else ErrFlag = true;
}
}
// Возвратить логическое значение true, если // индекс находится в установленных границах, private bool ok(int index) {
if(index >= 0 & index < Length) return true; return false;
}
}
// Продемонстрировать применение отказоустойчивого массива, class FSDemo {
static void Main {
FailSoftArray fs = new FailSoftArray(5); int x;
// Выявить скрытые сбои.
Console.WriteLine("Скрытый сбой."); for(int i=0; i < (fs.Length * 2); i++) fs[i] = i*10;
for(int i=0; i < (fs.Length * 2); i++) {
x = fs[i] ;
if (x != -1) Console.Write(x + " ") ;
Console.WriteLine ;
//А теперь показать сбои.
Console.WriteLine("ХпСбой с уведомлением об ошибках."); for(int i=0; i < (fs.Length * 2); i++) {
fs[i] = i * 10; if(fs.ErrFlag)
Console.WriteLine("fs[" + i + "] вне границ");
}
for(int i=0; i < (fs.Length * 2); i++) { N
x = f s [ i ] ;
if(!fs.ErrFlag) Console.Write(x + " "); else
Console.WriteLine("fs[" + i + "] вне границ");
}
}
}
Вот к какому результату приводит выполнение этой программы.
Скрытый сбой.
О 10 20 30 40 О О О О О
Сбой с уведомлением об ошибках.
fs[5] вне границ