在foreach循环内部或外部声明一个variables:哪个更快/更好?

哪一个是更快/更好的?

这个:

List<User> list = new List<User>(); User u; foreach (string s in l) { u = new User(); u.Name = s; list.Add(u); } 

或者这个:

 List<User> list = new List<User>(); foreach (string s in l) { User u = new User(); u.Name = s; list.Add(u); } 

我的新手发展技能告诉我,第一个更好,但我的一个朋友告诉我,我错了,但不能给我一个很好的理由,为什么第二个更好。

性能是否有所不同?

性能方面,这两个例子都编译到相同的IL,所以没有什么区别。

第二个更好,因为它更清楚地expression了你的意图,如果u只用在循环内。

在任何情况下,最好的方法是使用一个带有Name的构造函数,或者使用大括号表示法:

 foreach (string s in l) { list.Add(new User(s)); } 

要么

 foreach (string s in l) { list.Add(new User() { Name = s }); } 

甚至更好,LINQ:

 var list = l.Select( s => new User { Name = s}); 

现在,虽然你的第一个例子在某些情况下可能会更快,但是第二个例子会更好,因为它的可读性更高,编译器可能会丢弃这个variables(而完全忽略它),因为它并没有用在foreach的范围之外。

声明不会导致任何代码被执行,所以这不是一个性能问题。

第二个是你的意思,如果你是第二种方式,你不太可能犯一个愚蠢的错误,所以使用它。 总是尝试在必要的最小范围内声明variables。

而且,更好的方法是使用Linq:

 List<User> users = l.Select(name => new User{ Name = name }).ToList(); 

无论何时您对性能有疑问,唯一要做的就是测量 – 在testing周围运行一个循环并计时。

要回答你的问题 – 没有测量:-)或看着生成的ilasm – 在有意义的迭代次数中,任何差异都不会显而易见,并且代码中最昂贵的操作可能是由几个命令所以要专注于代码的清晰度(正如你应该一般的)并且跟2一样。

哦,已经很晚了,我想我只是想说,不要担心这类事情,或者被这样的细节困扰。

ķ

第二个更好。 您意味着在每次迭代中都有一个新用户。

从技术上讲,第一个例子会节省几个纳秒,因为堆栈帧将不必移动分配一个新的variables,但这是一个微不足道的CPU时间,你不会注意到,这就是如果编译器不优化任何差异。

在这种情况下,第二个版本更好。

一般来说,如果您只需要访问迭代体内的值,则select第二个版本。 另一方面,如果有一些最终状态variables将超出循环的主体,则声明然后使用第一个版本。

在performance上应该不会有令人难以置信的差异。