Следующее является стандартом SQL92, так должен поддерживаться большинством RDMBS, которые используют SQL:
CREATE INDEX [index name] ON [table name] ( [column name] )
Взгляните почти на любой из классов коллекций в структуре для примера. Если бы мне пришлось получить элемент из хеш-таблицы на языке без индексатора, я бы использовал синтаксис вроде:
object o = table.getvalue(key);
, где индексатор допускает несколько более простой синтаксис:
object o = table[key];
(намеренно игнорируя проблемы типизации / обобщения в примерах выше)
У вас есть несколько примеров в общих коллекциях самого фреймворка. Словарь - довольно хороший пример:
Dictionary<string, User> Users;
Users["Jorge"].ResetPassword();
Это было бы намного элегантнее и проще, чем
Users.GetElementByKey("Jorge").ResetPassword();
Предположим, вы разрабатываете Microsoft .NET Framework для использования другими разработчиками (что на самом деле является «реальным проектом»). Вам нужно написать класс, который действует как массив, но поддерживает динамическое изменение размера (класс List
). Без индексатора вы могли бы написать два метода для получения и установки элементов:
public T get(int index) { ... }
public void set(int index, T value) { ... }
// (Java advocates: no offense intended)
Предположим, что пользователь вашей библиотеки хочет увеличить второй элемент. Ей нужно будет написать:
list.set(1, list.get(1) + 1);
С индексатором синтаксис намного проще, читабельнее и легче для понимания:
list[1]++;
(аналогичные аргументы применимы к таким вещам, как Dictionary
...)
Ну, очевидным применением индексаторов является ... (сюрприз) Коллекции.
Например:
Списки:
список [4]
Хеш-таблицы:
таблица ["foo"]
таблица [Color.Black]
Помните, что индексаторы не ограничиваются целочисленными аргументами.
индексатор позволяет нам получить доступ к коллекция внутри класса, как если бы сам класс был массивом.
Хотя это правда, вы можете написать класс, который не имеет постоянный набор элементов внутри себя, но все же будет способен динамически предоставлять вам вычисленное значение при индексировании. Данные могут быть собраны в режиме реального времени из Интернета или любого другого источника данных - я представляю в качестве примера класс SearchResults
, который я мог бы использовать для получения результатов поиска Google для такой строки: Console.out.WriteLine (SearchResults ["Stackoverflow"]. Count)
. Он собирает данные только тогда, когда я их запрашиваю , и возвращает коллекцию извлеченных элементов.