性能:List.Count与检查存储的变量

时间:2013-06-18 13:10:48

标签: c# performance loops count

我想知道这是否有所不同:

 for (int i = 0; i < values.Count; i++)
        {
            //
        }

VS

int num = values.Count;

for(int=0; i<num; i++)
{

}

我认为第二种方法更好,因为您不需要计算每次迭代中的所有项目。但我可能错了。有人可以照亮我吗?

3 个答案:

答案 0 :(得分:14)

该列表已在内部存储其Count。您正在进行的比较与代码样式有关,而与性能无关。由于编译器将优化“Count”的检索

答案 1 :(得分:11)

你可以在这里查看.NET源代码 http://referencesource.microsoft.com/#mscorlib/system/collections/generic/list.cs#aa7e01fcb80a917e

  public int Count {
        get {
            Contract.Ensures(Contract.Result<int>() >= 0);
            return _size; 
        }
    }

看起来列表上的.Count属性会进行快速内部检查,然后返回_size。所以它应该非常接近你自己存储价值的表现。

答案 2 :(得分:3)

这完全取决于values是什么。 Count可以完全不同地实现,具体取决于此对象的类型。

如果您正在讨论通用List<T> - 那么Count将被实现为不重新评估的内部属性 - 因此是更好的选择。