数组/列表长度和字符串哈希代码是否已存储
本文关键字:代码 哈希 是否 存储 字符串 列表 数组 | 更新日期: 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。因此,无论何时添加或删除项目,都会增加或减少大小。所以它并不是真正计算出来的,总是存储在一个变量中。