Преимущество индексатора заключается, в частности, в том, что он позволяет полностью управлять доступом к массиву, избегая нежелательного доступа. В качестве примера рассмотрим программу, в которой создается класс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] вне границ

Перейти на страницу:

Похожие книги