тип_элемента this[int индекс]
{
// Аксессор для получения данных.
get
{
// Возврат значения, которое определяет индекс.
}
// Аксессор для установки данных.
set
{
// Установка значения, которое определяет индекс.
}
}
где тип_элемента обозначает конкретный тип элемента индексатора. Следовательно, у каждого элемента, доступного с помощью индексатора, должен быть определенный тип_элемента. Этот тип соответствует типу элемента массива. Параметр индекс получает конкретный индекс элемента, к которому осуществляется доступ.
В теле индексатора определены два аксессора (т.е. средства доступа к данным): get и set. Аксессор подобен методу, за исключением того, что в нем не объявляется тип возвращаемого значения или параметры. Аксессоры вызываются автоматически при использовании индексатора, и оба получают индекс в качестве параметра. Так, если индексатор указывается в левой части оператора присваивания, то вызывается аксессор set и устанавливается элемент, на который указывает параметр индекс. В противном случае вызывается аксессор get и возвращается значение, соответствующее параметру индекс. Кроме того, аксессор set получает неявный параметр value, содержащий значение, присваиваемое по указанному индексу.
//использовать индексатор для создания отказоустойчивого массива
using System;
class FailSoftArray
{
int[] a; //ссылка на базовый массив
public int Length; //открытая перемення длины массива
public bool ErrFlag; //обозначает резульат последней операции
//построить массив заданного размера.
public FailSoftArray(int size)
{
a = new int[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("\nСбой с уведомлением об ошибках.");
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++)
{
x = fs[i];
if (!fs.ErrFlag) Console.Write(x + " ");
else Console.WriteLine("fs[" + i + "] вне границ");
}
}
}