По умолчанию конструктор словаря «имеет начальную емкость по умолчанию», according to MSDN.
Он также заявляет:
Если вы можете оценить размер коллекции, используя конструктор, который определяет начальная способность устраняет необходимость выполнять ряд операций изменения размера при добавлении элементов в словарь.
Один такой конструктор просто берет Int32
, который инициализирует внутреннюю память следующим образом:
Начальное количество элементов, что словарь может содержать.
Что такое «начальная емкость по умолчанию» на самом деле является внутренней детализацией реализации этого класса и как таковой не отображается в документации или общедоступном API.
Дизассемблирование mscorlib
с ilspy
и рассматривая конструктор по умолчанию показывает, что она реализуется следующим образом:
public Dictionary() : this(0, null)
{
}
скованный конструктор реализован следующим образом:
public Dictionary(int capacity, IEqualityComparer<TKey> comparer)
{
if (capacity < 0)
{
ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity);
}
if (capacity > 0)
{
this.Initialize(capacity);
}
this.comparer = (comparer ?? EqualityComparer<TKey>.Default);
}
т.е. Initialize()
не вызывается вообще по конструктору по умолчанию, прямо или косвенно.
Initialize()
- это метод, который устанавливает внутреннее хранилище.
Так что, если вы вызываете конструктор по умолчанию, размер внутренней памяти даже не инициализируется, пока вы не добавите элемент. Таким образом, он имеет практически нулевой размер.
Initialize()
созывается со значением нуля при первом вызове .Add()
, , который устанавливает вещи вверх.
private void Initialize(int capacity)
{
int prime = HashHelpers.GetPrime(capacity);
this.buckets = new int[prime];
for (int i = 0; i < this.buckets.Length; i++)
{
this.buckets[i] = -1;
}
this.entries = new Dictionary<TKey, TValue>.Entry[prime];
this.freeList = -1;
}
GetPrime(0)
возвращается 3
, поэтому this.buckets
устанавливается на массив, содержащий три целых числа.
Линия, которая присваивает значение this.entries
, выглядит немного странно, но я не вижу, где в нее входит 100000.
Короткий ответ
Я думаю, что ваш коллега ошибается.
не могли бы вы быть добрыми и указать мне на этот источник? Я хочу знать, как это работает :) –
Расширение [.NET Reflector] (http://www.reflector.net/) предоставит вам практически любой код рамки. – AgentFire