Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Описание. Индексаторы являются синтаксическим удобством, позволяющим создавать класс, структуру или интерфейсСтр 1 из 4Следующая ⇒
Visual Studio 2008 Другие версии Обновлен: Ноябрь 2007 Индексаторы являются синтаксическим удобством, позволяющим создавать класс, структуру или интерфейс, доступ к которому клиентские приложения получают, как к массиву. Чаще всего индексаторы реализуются в типах, главная цель которых — инкапсуляция внутренней коллекции или массива. Например, предположим, что имеется класс с именем " TempRecord", представляющий набор температур по шкале Фаренгейта, полученных в 10 различных моментов в течение 24 часов. Класс содержит массив с именем " temps" типа " float", представляющий температуры, и DateTime, представляющий дату регистрации температур. Путем внедрения в этот класс индексатора клиенты получат доступ к температурам в экземпляре TempRecord с помощью float temp = tr[4], а не float temp = tr.temps[4]. Использование индексатора не только упрощает синтаксис для клиентских приложений, но и делает класс и его назначение интуитивно понятными для других разработчиков. Чтобы объявить индексатор для класса или структуры, используйте ключевое слово this как показано в следующем примере: Other public int this[int index] // Indexer declaration { // get and set accessors }
Заметки Тип индексатора и типы его параметров должны иметь по крайней мере такой же уровень доступности, как и сам индексатор. Дополнительные сведения об уровнях доступности см. в разделе Модификаторы доступа. Дополнительные сведения об использовании индексаторов с интерфейсом см. в разделе Индексаторы интерфейсов. Подпись индексатора состоит из количества и типов его формальных параметров. В подпись не включается тип индексатора или имена формальных параметров. Если в одном классе объявлено несколько индексаторов, у них должны быть различные подписи. Значение индексатора не классифицируется как переменная, поэтому не допускается передача значения индексатора как параметра ref или out. Чтобы предоставить индексатору имя, которое можно использовать в других языках, используйте в объявлении атрибут name. Пример. Other [System.Runtime.CompilerServices.IndexerName(" TheItem")] public int this [int index] // Indexer declaration { } Этот индексатор будет иметь имя TheItem. Если атрибут имени не предоставлен, используется имя по умолчанию Item. Пример 1 Описание В следующем примере показано, как объявить закрытое поле массива temps и индексатор. Индексатор обеспечивает прямой доступ к экземпляру tempRecord[i]. В качестве альтернативы применению индексатора можно объявить массив как член типа public осуществлять прямой доступ к его членам tempRecord.temps[i]. Обратите внимание, что при вычислении доступа индексатора, например, в инструкции Console.Write вызывается метод доступа get. Таким образом, если не существует метода доступа get, происходит ошибка времени компиляции. Код C# class TempRecord { // Array of temperature values private float[] temps = new float[10] { 56.2F, 56.7F, 56.5F, 56.9F, 58.8F, 61.3F, 65.9F, 62.1F, 59.2F, 57.5F };
// To enable client code to validate input // when accessing your indexer. public int Length { get { return temps.Length; } } // Indexer declaration. // If index is out of range, the temps array will throw the exception. public float this[int index] { get { return temps[index]; }
set { temps[index] = value; } } }
class MainClass { static void Main() { TempRecord tempRecord = new TempRecord(); // Use the indexer's set accessor tempRecord[3] = 58.3F; tempRecord[5] = 60.1F;
// Use the indexer's get accessor for (int i = 0; i < 10; i++) { System.Console.WriteLine(" Element #{0} = {1}", i, tempRecord[i]); }
// Keep the console window open in debug mode. System.Console.WriteLine(" Press any key to exit."); System.Console.ReadKey();
} }
Индексирование с использованием других значений C# не ограничивает тип индексатора типом " integer". Например, может оказаться полезным использовании в индексаторе строки. Такой индексатор можно реализовать, выполнив поиск строки в коллекции и возвратив соответствующее значением. Методы доступа можно перегружать, версии типа " string" и " integer" могут сосуществовать. Пример 2
|