ErrFlag = false;
return a[index];
}
else {
ErrFlag = true;
return 0;
}
}
Аксессор get
предотвращает ошибки нарушения границ массива, проверяя в первую очередь, находится ли индекс в установленных границах. Эта проверка границ выполняется в методе ok(),
который возвращает логическое значение true
, если индекс правильный, а иначе — логическое значение false
. Так, если указанный индекс находится в установленных границах, то по этому индексу возвращается соответствующий элемент. А если индекс оказывается вне установленных границ, то никаких операций не выполняется, но в то же время не возникает никаких ошибок переполнения. В данном варианте класса FailSoftArray
переменная ErrFlag
содержит результат каждой операции. Ее содержимое может быть проверено после каждой операции на предмет удачного или неудачного выполнения последней. (В главе 13 будет представлен более совершенный способ обработки ошибок с помощью имеющейся в C# подсистемы обработки исключительных ситуаций, а до тех пор можно вполне обойтись установкой и проверкой признака ошибки.)
А теперь рассмотрим следующий код аксессора set
, предотвращающего ошибки нарушения границ массива.
set {
if(ok(index) ) {
a[index] = value;
ErrFlag = false;
}
else ErrFlag = true;
}
Если параметр index метода ok()
находится в установленных пределах, то соответствующему элементу массива присваивается значение, передаваемое из параметра value. В противном случае устанавливается логическое значение true
переменной ErrFlag
. Напомним, что value
в любом аксессорном методе является неявным параметром, содержащим присваиваемое значение. Его не нужно (да и нельзя) объявлять отдельно.
Наличие обоих аксессоров, get и set
, в индексаторе не является обязательным. Так, можно создать индексатор только для чтения, реализовав в нем один лишь аксессор get
, или же индексатор только для записи с единственным аксессором set
.
Индексатор может быть перегружен. В этом случае для выполнения выбирается тот вариант индексатора, в котором точнее соблюдается соответствие его параметра и аргумента, указываемого в качестве индекса. Ниже приведен пример программы, в которой индексатор массива класса FailSoftArray
перегружается для индексов типа double
. При этом индексатор типа double
округляет свой индекс до ближайшего целого значения.
// Перегрузить индексатор массива класса FailSoftArray.
using System;
class FailSoftArray {
int[] a; // ссылка на базовый массив
public int Length; //открытая переменная длины массива
public bool ErrFlag; // обозначает результат последней операции
// Построить массив заданного размера,
public FailSoftArray(int size) {
a = new int[size];
Length = size;
}
// Это индексатор типа int для массива 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;
}
}
/* Это еще один индексатор для массива FailSoftArray.
Он округляет свой аргумент до ближайшего целого индекса. */
public int this[double idx] {
// Это аксессор get.
get {
int index;
// Округлить до ближайшего целого.
if((idx - (int) idx) < 0.5) index = (int) idx;
else index = (int) idx + 1;
if(ok(index)) {
ErrFlag = false;
return a[index];
}
else
{
ErrFlag = true;
return 0;
}
}
// Это аксессор set.
set {
int index;
// Округлить до ближайшего целого.
if( (idx - (int) idx) < 0.5) index = (int) idx;
else index = (int) idx + 1;
if (ok (index) ) {
a[index] = value;
ErrFlag = false;
}
else
ErrFlag = true;
}
}
// Возвратить логическое значение true, если