Поиск

Работа с объектами как с массивами с помощью индексаторов

Теперь вы знаете, как объявлять массивы и создавать их экземпляры, как работать с массивами разных типов и циклически обрабатывать элементы массивов. Вы также узнали, как для массивов использовать наиболее популярные свойства и методы, определенные в классе System.Array. Теперь перейдем к рассмотрению индексаторов — особой возможности С#, позволяющей программно обращаться с объектами так, как если бы они были массивами.

Но зачем это нужно? Как и в случае большинства функций языка программирования, польза от индексаторов в том, что писать приложения становится более интуитивно понятно. В разделе "Свойства как "умные поля"" вы узнали, как свойства в С# дают вам возможность ссылаться на поля класса с использованием стандартного синтаксиса класс.поле. Такие поля в конечном счете приводятся к методам-получателям и установщикам. Это абстрагирование освобождает программиста, пишущего клиент класса, от необходимости определения наличия у поля методов-получателей и установщиков и от необходимости знать их точный формат. Аналогично индексаторы позволяют клиенту класса индексировать объект, как если бы объект был массивом.

Рассмотрим пример. У вас есть класс "окно со списком", куда пользователь класса может вставлять строки. Если вы хорошо знакомы с Win32 SDK, то знаете, что для того, чтобы вставить строку в окно со списком, нужно послать ему сообщение LB^ADDSTRING или LBJNSERTSTRING. Когда этот механизм появился в конце 80-х годов, мы думали, что были настоящими объектно-ориентированными программистами. Разве после всего этого мы не посылали сообщения объекту, как нас учили все эти модные книги по объектно-ориентированному анализу и проектированию? Но с началом распространения таких объектно-ориентированных языков и языков на основе объектов, как C++ и Object Pascal, мы узнали, что объекты позволяют создавать более интуитивно понятные интерфейсы программирования для решения подобных задач. При использовании C++ и MFC (Microsoft Foundation Classes) нам доступна вся структура классов, позволяющая обращаться с окнами (такими, как окно со списком), как с объектами, классы которых содержат члены-функции, которые в основном являются тонкими оболочками для отсылки и получения сообщений от элементов управления Microsoft Windows. В случае класса CListBox (т. е. оболочки MFC для элемента управления Windows "окно со списком") для решения задач, выполнявшихся прежде путем отсылки сообщений LB_ADDSTRING и LBJNSERTSTRING, нам даны члены-функции AddString и InsertString.

Приняв это во внимание и стремясь облегчить создание лучшего и наиболее интуитивно понятного языка, команда разработчиков С# задалась вопросом: "А почему бы не предоставить возможность обработки объекта, который по своей сути является массивом, как массива?" Разве окно со списком — это не просто массив строк с дополнительной функциональностью вывода и сортировки? Вот из этой идеи и родилась концепция индексаторов.