C # в чем смысл или выгода индексатора?

Jedi Code Library предоставляет расширенный StringList со встроенной функцией Split, которая способна как добавлять, так и заменять существующий текст. Он также обеспечивает интерфейс с подсчетом ссылок. Таким образом, это можно использовать даже со старыми версиями Delphi, у которых нет SplitStrings и без осторожных и немного утомительных настроек запаса TStringList, чтобы использовать только указанные разделители.

Например, данный текстовый файл таких строк, как Dog 5 4 7 one могут анализировать их, используя:

var slF, slR: IJclStringList; ai: TList; s: string; i: integer;
    action: procedure(const Name: string; Const Data: array of integer);

slF := TJclStringList.Create; slF.LoadFromFile('some.txt');
slR := TJclStringList.Create;
for s in slF do begin
    slR.Split(s, ' ', true);
    ai := TList.Create;
    try
       for i := 1 to slR.Count - 1 do
           ai.Add(StrToInt(slR[i]));
       action(slR[0], ai.ToArray);
    finally ai.Free; end;
end; 

http://wiki.delphi-jedi.org/wiki/JCL_Help:IJclStringList.Split@string@string@Boolean

13
задан Robert Harvey 6 January 2010 в 22:47
поделиться

10 ответов

См. Спецификацию языка, раздел 10.9, в которой говорится:

Индексатор - это член, который позволяет индексировать объект так же, как массив.

Индексаторы и свойства очень похожи по концепции, но отличаются следующим образом:

  • Свойство идентифицируется по его имени, тогда как индексатор идентифицируется по его сигнатуре.
  • Доступ к свойству осуществляется посредством простого имени (§7.5.2) или доступа к члену (§7.5.4), тогда как доступ к элементу индексатора осуществляется через доступ к элементу (§7.5.6.2).
  • Свойство может быть статическим членом, тогда как индексатор всегда является членом экземпляра.
  • Метод доступа get свойства соответствует методу без параметров, тогда как метод доступа get индексатора соответствует методу с тем же списком формальных параметров, что и индексатор.
  • Метод доступа set свойства соответствует методу с одним параметром с именем value, тогда как метод доступа set индексатора соответствует методу с тем же списком формальных параметров, что и индексатор, плюс дополнительный параметр с именем value.
  • Объявление локальной переменной с тем же именем, что и параметр индексатора, является ошибкой времени компиляции.
  • В объявлении переопределяющего свойства доступ к унаследованному свойству осуществляется с помощью синтаксиса base.P, где P - имя свойства. В объявлении замещающего индексатора доступ к унаследованному индексатору осуществляется с использованием синтаксической базы [E], где E - это список выражений, разделенных запятыми.
22
ответ дан 1 December 2019 в 17:34
поделиться

Во многих случаях синтаксис 'index' имеет большой смысл. Это особенно полезно, если SomeClass представляет собой некую коллекцию.

6
ответ дан 1 December 2019 в 17:34
поделиться

Это позволяет выполнять поиск ассоциативных массивов (так же известный как "стиль словаря"), как вы упомянули в своем вопросе.

И в этом весь смысл. Некоторым это нравится, особенно людям, которые приходят из языков, на которых он встроен, таких как Python или PHP

.
3
ответ дан 1 December 2019 в 17:34
поделиться

Ключевое слово this является индексатором

из http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx

«Индексаторы позволяют экземпляры класса или структуры, которые должны индексироваться так же, как массивы. Индексаторы похожи на свойства, за исключением того, что их методы доступа принимают параметры ».

3
ответ дан 1 December 2019 в 17:34
поделиться

Это реализация оператора индекса [ ].

0
ответ дан 1 December 2019 в 17:34
поделиться

Это перегрузка оператора. Полезно, если вы пишете класс коллекции, например, когда имеет смысл получить к нему доступ, используя нотацию массива, например коллекция [someIndex].

Вы, конечно, можете написать эквивалент функции collection.GetElement (someIndex), но это вопрос стиля / удобочитаемости.

0
ответ дан 1 December 2019 в 17:34
поделиться

Этот метод можно использовать в классе пар ключ-значение.

Не знаю, что такое аналогичный класс в c#, но в c++ STL есть класс map, в котором вызывается метод с SomeObject["ключ"] и он возвращает "значение", связанное с этим ключом.

0
ответ дан 1 December 2019 в 17:34
поделиться

Это называется Indexer, они позволяют использовать List<>, ArrayList, Dictionary<> и все остальные коллекции, использующие синтаксис массивов.

Это просто синтаксический сахар, но он дает некоторую читабельность при правильном использовании.

0
ответ дан 1 December 2019 в 17:34
поделиться

Возможно, вы уже встречали нечто подобное раньше:

var myList = new List<string>();
myList.Add("One");
myList.Add("Two");
myList.Add("Three");

for(int i = 0; i < myList.Count; i++) {
    string s = myList[i];
}

Индексатор - это «первичный ключ» объекта, реализующего коллекцию. Это просто сокращенный способ написания такой функции, как .GetValue (index) - синтаксический сахар, если хотите. Но это также проясняет намерение.

1
ответ дан 1 December 2019 в 17:34
поделиться

Кажется, что многие ответы сфокусированы на том, что такое индексатор, а не на том, зачем его использовать.

Насколько я понимаю, вот мотивация использования индексатора:

Вы работаете над классом, который имеет какую-то коллекцию, но вы хотите, чтобы этот класс выглядел для пользователей (потребителей класса) так, как если бы он был коллекцией.

Лучший пример, который я могу придумать, это класс DataRow в ADO.NET. Если вы хотите получить значение пятой ячейки DataRow, вы можете использовать DataRow.Item[4] или DataRow[4]. Последняя форма является удобным и логичным сочетанием клавиш, и довольно хорошо показывает, зачем вам нужен индексатор. Для пользователя DataRow можно считать просто коллекцией ячеек (хотя на самом деле это нечто большее), поэтому имеет смысл иметь возможность получать и устанавливать значения ячеек напрямую, не задумываясь о том, что вы на самом деле получаете/устанавливаете Item.

Надеюсь, это поможет.

18
ответ дан 1 December 2019 в 17:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: