【问题标题】:Are array/list lengths and string hashcodes memoized?数组列表长度和字符串哈希码是否被记忆?
【发布时间】:2012-01-13 07:49:11
【问题描述】:

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

我之所以这么问,是因为我正在开发的一个记录链接程序已经足够复杂了,如果我能帮上忙,我宁愿不要在上面添加另一个 O(n)。

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

我可以看到大小与速度之间的权衡,但谁能确定是否有支持这些字段的支持字段?例如,由于在 C# 中,字符串是不可变的,所以在第一次调用 GetHashCode 时计算哈希码并将其存储以供以后使用不是有意义吗?

【问题讨论】:

标签: c#


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 对于一维数组,其实有一个IL OpCode可以将数组的长度直接压入执行栈,所以数组的长度存储在原始级别。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-30
      • 2019-08-08
      • 1970-01-01
      • 2021-05-23
      • 2021-06-17
      • 1970-01-01
      • 2013-08-16
      • 2015-01-01
      相关资源
      最近更新 更多