我不确定这是否是在这里问的正确问题,但请不要杀死我:)
我和一个朋友关于C#词典有一个争论……
她告诉我,如果我让我说1个元素的字典.密钥的哈希码为100000,则字典的内部数组的大小为100000!
是真的吗我试图在Google上找到答案,但由于某种原因我没有找到该问题.
解决方法:
字典的默认构造函数“具有默认的初始容量” according to MSDN.
它还指出:
If you can estimate the size of the collection, using a constructor that specifies the initial capacity eliminates the need to perform a number of resizing operations while adding elements to the Dictionary.
这样的构造函数只需要使用一个Int32,它就可以初始化内部存储,如下所示:
The initial number of elements that the Dictionary can contain.
字典的“默认初始容量”实际上是该类的内部实现细节,因此未在文档或公共API中公开.
用ilspy拆解mscorlib并检查默认构造函数表明,它的实现方式如下:
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()是设置内部存储的方法.
因此,实际上,如果您调用默认构造函数,则在您第一次添加项目之前,甚至不会初始化内部存储大小.因此,它的大小基本上为零.
首次调用.Add()时,Initialize()最终将以零值被调用.
设置好了.
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.
简短答案
我认为你的同事错了.