OOP Course
Сьогодні

Підрозділ 8.4

Індексатори

Пояснює індексатори, доступ до об'єктів за індексом, рядкові індекси, кілька параметрів, блоки get/set і перевантаження індексаторів.

8.4. Індексатори

Масиви зручні тим, що до елементів можна звертатися за індексом: arr[0], arr[i]. Але іноді ми хочемо, щоб і власний клас підтримував таку синтаксичну форму — наприклад, звертатися до пацієнтів відділення як ward[0], ward[i], або до атрибутів пацієнта як patient["diagnosis"]. Саме для цього у C# існують індексатори (indexers).

Індексатор — це спеціальний член класу, який дозволяє звертатися до об'єкта за допомогою квадратних дужок, як до масиву або словника. За своєю формою він нагадує властивість: також має блоки get і set, також має тип. Ключова відмінність — замість фіксованої назви використовується ключове слово this і параметр у квадратних дужках.

Синтаксис індексатора

тип_результату this[Тип параметр, ...]
{
    get { ... }
    set { ... }
}
  • this — ключове слово замість назви. Означає «доступ до цього об'єкта за індексом».
  • Тип у квадратних дужках — тип індексу (може бути int, string або будь-яким іншим).
  • get — повертає значення за вказаним індексом.
  • set — записує значення; переданий об'єкт доступний через неявний параметр value.
  • Індексатор не може бути статичним — він завжди прив'язаний до екземпляра.

Індексатор: синтаксис та порівняння з властивістю

Числовий індексатор

Найпоширеніший варіант — індексатор з параметром int, який дозволяє звертатися до елементів внутрішньої колекції об'єкта. Визначимо клас Ward (відділення лікарні), що зберігає масив пацієнтів і надає доступ до них за позицією:

Блок get перевіряє межі масиву і генерує ArgumentOutOfRangeException, якщо індекс некоректний — так само, як поводиться звичайний масив при виході за межі. Блок set виконує ту саму перевірку перед записом.

Рядковий індексатор

Індекс не обов'язково має бути цілим числом. Рядковий індекс зручний, коли об'єкт зберігає набір іменованих атрибутів. Визначимо Patient із доступом до клінічних даних за ключовим рядком:

Рядковий індексатор дає інтерфейс, схожий на словник, але з чіткими дозволеними ключами і можливістю додати валідацію або логіку перетворення прямо в get/set.

Індексатор із кількома параметрами

Індексатор може приймати більше одного параметра. Це корисно для двовимірних структур, наприклад, для розкладу прийомів лікаря, де день і час — це два незалежні виміри:

Синтаксис звернення schedule[0, 9] виглядає так само природно, як доступ до двовимірного масиву. Компілятор транслює це в виклик індексатора з двома аргументами.

Модифікатори доступу та readonly-індексатор

Як і у властивостей, в індексаторах можна опустити блок set (тоді індексатор лише для читання) або обмежити його доступ модифікатором:

// Тільки для читання — set відсутній
public Patient this[int index]
{
    get => _patients[index];
}

// set приватний — зовні не можна записати
public Patient this[int index]
{
    get => _patients[index];
    private set => _patients[index] = value;
}

Readonly-індексатор корисний для незмінних колекцій (наприклад, архівних записів), де зовнішній код має тільки читати дані, але не змінювати їх.

Перевантаження індексаторів

Так само як і методи, індексатори можна перевантажувати — визначити кілька версій з різними типами або кількістю параметрів. Визначимо Ward одночасно з числовим доступом (за позицією) і рядковим (за ім'ям пацієнта):

Компілятор розрізняє перевантажені варіанти за типом аргументу у дужках: ward[0] — це int, тому викликається перший індексатор; ward["Марія Коваль"] — це string, тому другий. Перевантаження за кількістю параметрів також дозволене.

Індексатори можуть бути віртуальними і абстрактними — їх можна перевизначати у похідних класах так само, як і методи, що дозволяє будувати гнучкі ієрархії класів із уніфікованим синтаксисом доступу.

Розроблено Tomka Yurii · © 2026 ·