Для объекта класса возможно достаточно разумно иметь то, что ведет себя как получатель именованного индексированного свойства, если свойство возвращает struct
, которое просто содержит частную ссылку на объект класса и включает в себя получатель индексированного свойства, который цепочки к методу в классе. Такая одноэлементная структура может быть сгенерирована практически без затрат (она, вероятно, может поместиться в регистр и будет загружена значением, которое находится в другом регистре; JIT может даже распознать, что тот же регистр может использоваться для обе цели), поэтому, если использование такого метода получения делает код более читабельным, это является существенным аргументом в пользу.
К сожалению, неспособность членов структуры указать, изменяют ли они базовую структуру или нет, делает невозможным использование того же подхода для установщика индексированных свойств. Хотя было бы полезно, если бы у вас был OrderedCollection<T>
с чем-то вроде:
struct ByIndexAccessor {
OrderedCollection<T> owner;
ByIndexAccessor(OrderedCollection<T> o) { owner = o; }
T this[int index] {
get { return owner.handleGet(index); }
set { owner.handleSet(index, value); }
}
}
ByIndexAccessor ByIndex {
get {return new ByIndexAccessor(this); }
}
и, скажем, myCollection.ByIndex[3] = newThing;
, C # отвергнет такой код, потому что не может знать, что эту конкретную индексированную реализацию set
можно безопасно использовать в структуре только для чтения.