То, как я смотрю на индексаторы, заключается в том, что (правильно или неправильно!) Доступ к чему-либо по индексу должен быть более эффективным, чем доступ к нему любым другим способом, потому что в некотором роде или форме класс, чей индексатор я использую хранит некоторую форму index , которая позволяет быстро искать значения при доступе таким образом.
Классическим примером является массив, когда вы обращаетесь к элементу n массива с помощью кода myarray [3], компилятор / интерпретатор знает, насколько большими (с точки зрения памяти) являются элементы массива, и может рассматривать его как смещение от начала массива. Вы также можете "for(int i = 0; i < myarray.length; i++) { if (i = 3) then { .. do stuff } }"
(не то, что вы когда-либо хотели бы!), Что было бы менее эффективно. Также показано, как массив является плохим примером.
Скажем, у вас был класс коллекции, в котором хранятся DVD-диски, так что:
public class DVDCollection
{
private Dictionary<string, DVD> store = null;
private Dictionary<ProductId, string> dvdsByProductId = null;
public DVDCollection()
{
// gets DVD data from somewhere and stores it *by* TITLE in "store"
// stores a lookup set of DVD ProductId's and names in "dvdsByProductid"
store = new Dictionary<string, DVD>();
dvdsByProductId = new Dictionary<ProductId, string>();
}
// Get the DVD concerned, using an index, by product Id
public DVD this[ProductId index]
{
var title = dvdsByProductId[index];
return store[title];
}
}
Просто мой 2p, но, как я уже сказал, .. Я всегда считал «индексатор» удобным способом извлечения данных из чего-либо.