有没有人碰巧知道,在.NET(4.0,如果重要)中,数组的Length属性,或List<T>
的Count属性是否在计算之后存储,直到数组/列表被更改?
我问,因为我正在研究的记录联动程序已经非常复杂,如果我能帮助它,我宁愿不在事物之上添加另一个O(n)。
沿着类似的路线,实例化的System.String的哈希码是否被记忆?通过调试器查看它,我可以看到List<T>
有一个私有的_size成员,可能是Count获取其值的地方,但是我没有看到int []或字符串表明它们没有把它存放在任何地方。
我可以看到大小与速度的权衡,但是有人能告诉我是否有支持这些的支持字段?例如,因为在C#中,字符串是不可变的,在第一次调用GetHashCode
时计算哈希码是否有意义,并且只是将其存储在以后的每一次使用中?
答案 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;
}