• Добро пожаловать на сайт - Forumteam.men !

    Что бы просматривать темы форума необходимо зарегестрироваться или войти в свой аккаунт.

    Группа в телеграме (подпишитесь, что бы не потерять нас) - ForumTeam Chat [Подписатся]
    Связь с администратором - @ftmadmin

27. Разбираемся с индексаторами.

Redman

<FORUMTEAM>
Команда форума
Регистрация
13.11.17
Сообщения
13.343
Реакции
8.371
Баллы
1.200
FTC
203¢
Индексаторы
Индексаторы напоминают перегруженный оператор индексации в 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;
   }
}

Отличия между свойствами и индексаторами
Представим отличия в виде таблицы:
bbf7e71bf2d1.jpg


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