Рассмотрев преимущество использование свойств по сравнению с открытыми полями, перейдём к ещё одной интересной возможности C#, которая называется индексаторы.
Индексаторы — это члены класса, которые позволяют получить доступ к полям класса способом доступа к элементам массива, т.е. по индексу.
Индексаторы очень похожи на свойства. Для каждого индексатора так же может быть два метода: один — для чтения значения поля (get), другой — для записи в него какого-то значения (set). В индексаторе могут быть определены оба метода или только какой-либо один.
Формальная запись объявления индексатора имеет следующий вид:
Доступ Тип this [int индекс]
{
get
{
return имя_массива[индекс];
}
set
{
имя_массива[индекс] = value;
}
}
Имя индексатора всегда одно и тоже, а имено: this.
Пример 1. Разработаем класс для работы с одномерным массивом. Создадим в нём индексатор, позволяющий обращаться к элементу массива по индексу.
Текст программы:
using System;
namespace Test_Indeksator1
{
class Mas
{
private int n;
private double []x;
public Mas()
{
n=1;
x=new double[n];
x[0]=1;
}
public Mas(int n0)
{
n=n0;
if(n<1) n=1;
x=new double[n];
for (int i = 0; i < n; i++) {
x[i]=1+i;
}
}
public double this[int i]
{
set
{
x[i]=value;
}
get
{
return x[i];
}
}
public void print()
{
Console.WriteLine("Массив:");
for (int i = 0; i < n; i++) {
Console.WriteLine(x[i]);
}
}
}
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Тестирование работы индексаторов");
Mas x = new Mas(3);
// Использование индексатора для записи
x[0]=5;
// Использование индексатора для чтения
Console.WriteLine(x[1]);
x.print();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результат работы программы:
Тестирование работы индексаторов
2
Массив:
5
2
3
Press any key to continue . . .
Пример 2. Разработаем класс для работы с двумерным массивом (матрицей). Создадим в нём индексатор, позволяющий обращаться к элементу матрицы по индексу.
Текст программы:
using System;
namespace Test_Indeksator2
{
class Matr
{
private int n;
private int m;
private double [,]x;
public Matr()
{
n=m=1;
x=new double[n,m];
x[0,0]=1;
}
public Matr(int n0, int m0)
{
n=n0;
if(n<1) n=1;
m=m0;
if(m<1) m=1;
x=new double[n,m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
x[i,j]=(i+1)*10+j+1;
}
}
}
public double this[int i, int j]
{
set
{
x[i,j]=value;
}
get
{
return x[i,j];
}
}
public void print()
{
Console.WriteLine("Матрица:");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
Console.Write(x[i,j].ToString()+" ");
}
Console.WriteLine();
}
}
}
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Тестирование работы индексаторов");
Matr x = new Matr(3,3);
// использование индексатора для записи
x[0,0]=5;
// использование индексатора для чтения
Console.WriteLine(x[1,1]);
x.print();
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результат работы программы:
Тестирование работы индексаторов
22
Матрица:
5 12 13
21 22 23
31 32 33
Press any key to continue . . .
|
|
|