https://referencesource.microsoft.com/#System.Core...
Вот, к примеру, там есть много обращений к массиву по индексу, чтобы получить доступ к полям оного и того же объекта.
m_slots[index].hashCode = hashCode;
m_slots[index].value = value;
m_slots[index].next = m_buckets[bucket] - 1;
Добавил позже:
Возможно, если в качестве T будет Value Type, то мы можем скопировать значение из массива и не присвоить ничего значению в массиве?
Добавил позже:
Ну в таком случае, сначала получаем копию из массива, над ней работаем, а потом присваиваем обратно по нужному индексу изменённую копию. За то избавляемся от кучи обращений через индексатор.
Добавил позже:
Ну да, как я и думал
using System;
namespace TestValueType
{
class Program
{
#region Entry point
private static Program _program;
private static void Main(string[] args)
{
_program = new Program();
_program.Run(args);
}
#endregion
private void Run(string[] args)
{
_slots = new Slot[]
{
new Slot { hashCode = 1, value = 10 },
new Slot { hashCode = 2, value = 20 },
new Slot { hashCode = 3, value = 30 },
new Slot { hashCode = 4, value = 40 },
};
//_slots[0].value = 70;
Slot slot = _slots[0];
slot.value = 70;
Display(_slots[0]);
Console.ReadKey();
}
private void Display(Slot slot)
{
Console.WriteLine(slot.ToString());
}
private Slot[] _slots;
internal struct Slot
{
internal int hashCode; // Lower 31 bits of hash code, -1 if unused
internal int value;
/// <summary>
/// Возвращает полное имя типа этого экземпляра.
/// </summary>
/// <returns>
/// Объект типа <see cref="T:System.String"/>, содержащий полное имя типа.
/// </returns>
public override string ToString()
{
return $"hashCode = {hashCode}, value = {value}";
}
}
}
}