Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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; 
   }
}

Отличия между свойствами и индексаторами

Представим отличия в виде таблицы:

Свойства Индексаторы
Идентифицируется по имени Идентифицируется по сигнатуре
Доступ осуществляется, как для члена класса, через точку Доступ осуществляется, как для элемента массива, с помощью квадратных скобок
Может быть статическим или нестатическим членом класса Может быть только нестатическим членом класса
Функция доступа get не имеет параметров Функция доступа get имеет тот же список параметров, что и индексатор
Функция доступа set содержит встроенный параметр value Функция доступа set в дополнении к встроенному параметру value имеет тот же список параметров, что и индексатор

*****
Индексаторы не являются переменными. Нельзя передать индексатор в функцию как ref или out параметр.
*****
Более подробную информацию можно получить, изучив практические 
примеры, или заглянув в MSDN.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru