Главная страница Библиотека (скачать книги) Скачать софт Введение в программирование Стандарты для C++ Уроки по C# Уроки по Python HTML Веб-дизайн Ассемблер в среде Windows ActiveX Javascript Общее о Линукс Линукс - подробно Линукс - новое Delphi Паскаль для начинающих Турбопаскаль Новости Партнеры Наши предложения Архив новостей |
ИндексаторыИндексаторы напоминают перегруженный оператор индексации в C++, они позволяют обращаться к экземпляру класса или структуры, как к массиву. Индексаторы похожи на свойства, но их функции доступа могут принимать параметры. ***** Следующий пример приведен лишь в "воспитательных целях" для ознакомления с некоторыми возможностями индексаторов. ***** using System; using System.Collections; class SomeClass : IEnumerable // Для использования foreach { // Поле string [] words; // Числовой индексатор public string this [int index] { // Функция чтения get { if(index < 0 || index >= words.Length) throw new IndexOutOfRangeException(); return words[index]; } // Функция записи set { if(index < 0 || index >= words.Length) throw new IndexOutOfRangeException(); words[index] = value; } } // Строковый индексатор public int this [string name] { // Функция чтения get { // Поиск индекса, соответствующего искомой строке return Array.IndexOf(words, name); } } public SomeClass(int n) { if(n >= 0) words = new string[n]; } // Реализация интерфейса IEnumerable public IEnumerator GetEnumerator() { // Массивы реализуют интерфейс IEnumerable самостоятельно return words.GetEnumerator(); } } class Test { static void Main() { SomeClass sc = new SomeClass(3); // Используем числовой индексатор sc[0] = "book"; sc[1] = "bird"; sc[2] = "beer"; // Перебор значений массива foreach(string s in sc) { Console.WriteLine(s); } // Используем строковый индексатор Console.WriteLine(sc["beer"]); Console.WriteLine(sc["boat"]); } } Интерфейсы и индексаторыПри объявлении индексатора в интерфейсе нужно придерживаться следующих правил: индексатор описывается без модификаторов, индексатор должен иметь функции доступа без тела. interface IMyInterface { ... // Объявление индексатора string this[int index] { get; set; } } Отличия между свойствами и индексаторамиПредставим отличия в виде таблицы:
***** Индексаторы не являются переменными. Нельзя передать индексатор в функцию как ref или out параметр. ***** Более подробную информацию можно получить, изучив практические примеры, или заглянув в MSDN. |
|||||||||||||
Библиотека программиста. 2009. |
|