数组/列表长度和字符串哈希代码是否已存储

本文关键字:代码 哈希 是否 存储 字符串 列表 数组 | 更新日期: 2023-09-27 18:20:21

有人知道在.NET(4.0,如果重要的话)中,数组的Length属性或List<T>的Count属性是在计算后存储的,直到数组/列表更改为止吗?

我之所以这么问,是因为我正在研究的一个唱片链接程序已经非常复杂了,如果我能帮上忙的话,我宁愿不在上面再加一个O(n)。

类似地,实例化的System.String的哈希代码是否已存储?通过调试器查看它,我可以看到List<T>有一个private_size成员,可以在Count获取其值的位置,但我看不到int[]或string的任何内容,表明它们将其存储在任何位置。

我可以看到大小与速度的权衡,但有人能肯定地告诉我是否有后备字段可以容纳这些吗?例如,由于在C#中,字符串是不可变的,所以在第一次调用GetHashCode时计算哈希代码,并将其存储起来以备以后使用,这难道没有意义吗?

数组/列表长度和字符串哈希代码是否已存储

来源http://msdn.microsoft.com/en-us/library/6sh2ey19(v=VS.100).aspx

List类是ArrayList类的通用等价物。它使用大小为的数组实现IList通用接口根据需要动态增加。

这意味着,Length属性在任何时间点都是已知的,不需要计算。

使用反射器实现List<T>.Count是:

public int Count
{
  get
  {
    return this._size;
  }
}

我不确定Array.Length。它的代码是:

public int Length 
{ 
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), 
    SecuritySafeCritical, MethodImpl(MethodImplOptions.InternalCall)] 
    get; 
}

在.NET参考源代码中,我查看了List。它包含一个变量_size。因此,无论何时添加或删除项目,都会增加或减少大小。所以它并不是真正计算出来的,总是存储在一个变量中。