Индексаторы

Рассмотрев преимущество использование свойств по сравнению с открытыми полями, перейдём к ещё одной интересной возможности 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 . . .

Назад
На верх
Вперёд
Hosted by uCoz