← Назад к вопросам

Что такое индексатор?

2.0 Middle🔥 101 комментариев
#ООП и паттерны проектирования#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое индексатор в C#?

Индексатор — это специальный член класса в C#, который позволяет обращаться к объекту как к массиву или коллекции, используя синтаксис квадратных скобок []. По сути, индексатор предоставляет индексированный доступ к данным внутри объекта, скрывая внутреннюю реализацию хранения и предоставляя удобный интерфейс для работы с элементами.

Основные характеристики индексатора:

  • Индексатор объявляется с использованием ключевого слова this.
  • Он может иметь один или несколько параметров (индексов), которые могут быть любого типа.
  • Индексатор не имеет имени — вместо имени используется this.
  • Он может быть перегружен (несколько индексаторов с разными типами параметров).
  • Индексаторы могут быть одномерными или многомерными (например, для имитации матриц).
  • Они могут иметь модификаторы доступа (public, private и т.д.) и поддерживают get и set аксессоры для чтения и записи значений.

Синтаксис объявления индексатора:

public тип_возвращаемого_значения this[тип_индекса индекс]
{
    get
    {
        // Логика возврата значения по индексу
    }
    set
    {
        // Логика установки значения по индексу (value — передаваемое значение)
    }
}

Пример простого индексатора:

Рассмотрим класс StringCollection, который хранит массив строк и предоставляет доступ к ним через индексатор.

public class StringCollection
{
    private string[] _items = new string[10];

    // Одномерный индексатор с целочисленным индексом
    public string this[int index]
    {
        get
        {
            // Проверка границ индекса (упрощённо)
            if (index >= 0 && index < _items.Length)
                return _items[index];
            throw new IndexOutOfRangeException();
        }
        set
        {
            if (index >= 0 && index < _items.Length)
                _items[index] = value;
            else
                throw new IndexOutOfRangeException();
        }
    }

    // Перегруженный индексатор с строковым индексом (например, для поиска по ключу)
    public string this[string key]
    {
        get
        {
            // Пример: возвращаем строку по ключу (условная логика)
            return _items.FirstOrDefault(item => item == key);
        }
    }
}

// Использование индексатора
var collection = new StringCollection();
collection[0] = "Hello";  // set-аксессор
string value = collection[0];  // get-аксессор
string found = collection["Hello"];  // Использование перегруженного индексатора

Ключевые преимущества индексаторов:

  • Инкапсуляция: Индексатор скрывает внутреннюю структуру данных (массив, список, словарь и т.д.), позволяя изменять её без влияния на клиентский код.
  • Удобство: Синтаксис [] интуитивно понятен для разработчиков, работающих с коллекциями.
  • Гибкость: Можно реализовать сложную логику доступа (например, доступ к данным БД, файлам или вычисляемым значениям).
  • Перегрузка: Поддержка разных типов индексов (целые числа, строки, перечисления и др.) для разнообразных сценариев использования.

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

  • Свойства предоставляют доступ к одиночным значениям, а индексаторы — к набору значений через индекс.
  • Методы требуют вызова с круглыми скобками и могут иметь произвольные имена, тогда как индексаторы используют [] и не имеют имени.
  • Индексаторы могут рассматриваться как "умные массивы", сочетающие преимущества методов и свойств.

Пример многомерного индексатора:

Индексаторы могут имитировать многомерные структуры, например, матрицу.

public class Matrix
{
    private int[,] _data = new int[3, 3];

    // Многомерный индексатор
    public int this[int row, int column]
    {
        get => _data[row, column];
        set => _data[row, column] = value;
    }
}

// Использование
var matrix = new Matrix();
matrix[0, 0] = 1;
int element = matrix[0, 0];

Важные замечания:

  • Индексаторы не могут быть статическими — они всегда работают с экземплярами класса.
  • Они могут использоваться в интерфейсах для определения контракта индексированного доступа.
  • В отличие от массивов, индексаторы могут использовать нечисловые индексы (например, строки для доступа по ключу).
  • Индексаторы часто применяются в коллекциях (например, List<T>, Dictionary<TKey, TValue>), где они реализованы для удобства работы.

Заключение:

Индексаторы в C# — это мощный инструмент для создания классов, которые ведут себя как коллекции или массивы. Они улучшают читаемость кода, обеспечивают инкапсуляцию и гибкость, позволяя разработчикам проектировать интуитивно понятные API. Правильное использование индексаторов способствует написанию чистого и поддерживаемого кода, особенно в библиотеках и фреймворках, где часто требуется работа с наборами данных.