是否记忆了数组/列表长度和字符串哈希码?

时间:2012-01-12 23:01:25

标签: c#

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

我问,因为我正在研究的记录联动程序已经非常复杂,如果我能帮助它,我宁愿不在事物之上添加另一个O(n)。

沿着类似的路线,实例化的System.String的哈希码是否被记忆?通过调试器查看它,我可以看到List<T>有一个私有的_size成员,可能是Count获取其值的地方,但是我没有看到int []或字符串表明它们没有把它存放在任何地方。

我可以看到大小与速度的权衡,但是有人能告诉我是否有支持这些的支持字段?例如,因为在C#中,字符串是不可变的,在第一次调用GetHashCode时计算哈希码是否有意义,并且只是将其存储在以后的每一次使用中?

3 个答案:

答案 0 :(得分:2)

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

  

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

这表明,长度属性在任何时间点都是已知的,无需计算。

答案 1 :(得分:1)

.NET Reference Source Code开始,我查看了List。它包含一个变量_size。因此,无论何时添加或删除项目,它都会递增或递减大小。所以它并没有真正计算出来,总是存储在一个变量中。

答案 2 :(得分:1)

使用反射器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; 
}