Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多种.计数用法的最佳实践_C# - Fatal编程技术网

C# 多种.计数用法的最佳实践

C# 多种.计数用法的最佳实践,c#,C#,那么,就性能/最佳实践等而言,以下两个代码块中哪一个是“最佳”的 每次使用时多次调用.Count属性 List<string> myStrings = new List<string>(); myStrings.Add("foo"); myStrings.Add("bar"); if (myStrings.Count >= 1) { Console.WriteLine(myStrings.Count); } List myStrings=new List

那么,就性能/最佳实践等而言,以下两个代码块中哪一个是“最佳”的

每次使用时多次调用
.Count
属性

List<string> myStrings = new List<string>();
myStrings.Add("foo");
myStrings.Add("bar");

if (myStrings.Count >= 1)
{
    Console.WriteLine(myStrings.Count);
}
List myStrings=new List();
添加(“foo”);
添加(“条”);
如果(myStrings.Count>=1)
{
Console.WriteLine(myStrings.Count);
}
将计数存储一次并重用它,因为我们可以假设列表不会发生任何更改

List<string> myStrings = new List<string>();
myStrings.Add("foo");
myStrings.Add("bar");

int myCount = myStrings.Count;
if (myCount >= 1)
{
    Console.WriteLine(myCount);
}
List myStrings=new List();
添加(“foo”);
添加(“条”);
int myCount=myStrings.Count;
如果(myCount>=1)
{
控制台写入线(myCount);
}

myStrings.Count
实际上并不计算任何东西,它只是获取存储的计数并返回它。因此,情况大致相同

对于这样一个简单的情况,由于优化器将对列表进行优化而使其保持一致的注释可能是正确的,但如果编译器不能确定列表不是从另一个线程访问的,则肯定不是正确的。

对于
列表
,这并不特别重要,因为列表存储了它的计数,并且能够便宜地返回它


对于任意
IEnumerable
上的
Count
扩展方法,最好使用临时变量以避免多次调用
Count
。这是因为
Count
扩展方法必须遍历整个集合(它将检测
IList
并使用快速计数,但例如
产生返回值
枚举项不实现
IList
)。

没有区别。无论如何,JIT都会对其进行优化。在这种情况下,优化器可以证明
myStrings
不会在另一个线程中使用,但它确实进行了优化吗?嗯,没有上下文很难说。很少的CPU指令对应用程序的性能有影响吗?您是否打算概括单线程和多线程应用程序的问题/答案(即,
List.Count
在两次调用之间可能会发生变化)?绩效是主观的,也是最佳实践。。最佳实践是理解和实现为您的场景提供正确语义的内容。在某些情况下,任何其他盲目的建议都可能造成麻烦。示例-当多线程处理每个给定的代码示例可能会提供非常不同的结果时,因此我假设您将设计代码并使用适合代码实际工作方式的示例(以及可能的锁)。因此,假设这个问题是针对单线程的,但确实提到了任何感兴趣的多线程点?好吧,这个例子可能会被修改为需要一千个“.Count”检查作为循环的一部分,这样CPU指令肯定会在那里产生很大的影响。@VikasGupta虽然最佳实践是基于个案的基础上进行的,但仍然可以根据情况x、y和z提出建议。我的具体示例/用法非常广泛,因为我似乎每隔几天都会在一个稍微不同的场景中遇到它,所以我认为了解最常见场景的最佳实践可以将其应用到其他场景中。我相当确定运行时有权优化调用,即使它无法证明另一个线程将无法访问它。毕竟,这就是为什么我们有锁、volatile等等——告诉运行时什么可以优化,什么应该等待同步。只是澄清一下,“或多或少相同!=“相同”?当你提到优化时,你是指“优化器”吗“是否会简单地重复使用从第一次呼叫中收到的结果?非常想知道@Stillgar是否也是正确的,那么还有人想在这里称重吗?回答得很好,谢谢。因此,您建议对IEnumerable使用第二种方法,但对列表使用第一种方法?@Adrian773:在这两种情况下只使用临时变量更安全。例外情况是数组的
长度
。。。在那里,您应该在for循环控制表达式中使用
Length
,而不是包含相同值的局部变量,因为JIT编译器依赖于查看对
Length
的访问来删除循环内的边界检查。