Я наткнулся на fact, что индекс this[int index] { get; }
работает по-разному для массива структур, чем для списка структур. А именно, что индексщик в случае T[]
возвращает ссылку на элемент внутри массива, тогда как индексщик в случае List<T>
возвращает копию элемента.Атрибут индекса индекса массива возвращает объект - это поле?
Это очень большая семантика и разница в производительности, и я рад, что T[]
позволяет нам обойти ограничение производительности List<T>
.
Однако, я озадачен фактической реализацией. code для Array
в справочных источниках .net звучит так:
Object IList.this[int index] {
get { return GetValue(index); }
set { SetValue(value, index); }
}
Где GetValue
определяется следующим образом:
public unsafe Object GetValue(int index)
{
if (Rank != 1)
throw new ArgumentException(Environment.GetResourceString("Arg_Need1DArray"));
Contract.EndContractBlock();
TypedReference elemref = new TypedReference();
InternalGetReference(&elemref, 1, &index);
return TypedReference.InternalToObject(&elemref);
}
возвращаемый тип индексатора Object
, подразумевая, что бокс будет иметь место.
Итак, мой вопрос: могу ли я быть уверенным, что никакой бокс не произойдет, когда я получаю доступ к элементу T[]
, где T
является структурой?
Я предполагаю, что компилятор и/или CLR относятся к массиву специально и на самом деле не беспокоят подпись индексатора. Это верно? Есть ли более полное обсуждение этого?
'IList.SomeMethod' - это реализация [implicit intefrace] (http://stackoverflow.com/q/143405/1997232). Это способ сказать * «этот метод существует, если объект классифицируется как« IList »*. Он будет использоваться только в том случае, если вы специально запросите его, например. в случае индексатора '((IList) someArray) [x]'. Другое обращение к индексу индекса массива (например, 'someArray [x]') - другое дело, вы не найдете источников для какого-либо метода, потому что их нет. – Sinatr