ИНДЕКСИРУЮЩЕЕ СВОЙСТВО C#

C Sharp > ИНДЕКСИРУЮЩЕЕ СВОЙСТВО C#
28.10.2016 14:54:35



Статья:

Данное свойство используется, если необходимо иметь доступ к элементу по индексу. Давайте сразу на примере реализуем. Создадим класс "Point", который содержит координаты "x" и "y". Данные поля будут приватными. Также создадим 2 свойства ("Property") для доступа к приватным полям класса, которые будут публичными:

class Point
{
private int x;
private int y;

public int X
{
get { return x; }
set { x = value; }
}
public int Y
{
get { return y; }
set { y = value; }
}
}
Теперь сделаем так, чтобы можно было обращаться к данным полям по индексу. Т.е. мы хотим, чтобы было так:

Point point1 = new Point();
point1.X = 50;
point1.Y = 100;
Console.WriteLine("({0},{1})", point1[0], point1[1]);
Console.ReadLine();
Для того, чтобы реализовать оператор индексации для этого класса, нужно реализовать индексирующее свойство. Реализуется оно следующим образом:


public int this[int i]
{
get
{
switch(i)
{
case 0: return this.X;
case 1: return this.Y;
// В случае неверного индекса выбрасываем исключение.
default: throw new ArgumentOutOfRangeException("Неверный индекс");
}
}
}
В данном случае мы реализовали только "getter", т.е. мы сможем только прочитать значения. Реализуем "setter":


set
{
switch (i)
{
case 0:
{
this.X = value;
break;
}
case 1:
{
this.Y = value;
break;
}
default: throw new ArgumentOutOfRangeException("Неверный индекс");
}
}
Используем наше свойство в деле:

point1[0] = 100;
point1[1] = 200;
Console.WriteLine("({0},{1})", point1[0], point1[1]); // выйдет (100,200)
Ещё раз хочу обратить ваше внимание на синтаксис создание индексирующего "Property": this[int x]. Причем через запятую можно указать множество индексов. Индекс необязательно должен быть типа "int".