我使用的语言是C#。
我们有一个T
,
List<T> collection = new List<T>{.....};
假设我们想要查看每个收集项目。这可以通过多种方式完成。其中有以下两种:
foreach(var item in collection)
{
// code goes here
}
和
foreach(T item in collection)
{
// code goes here
}
第二种方式是否优于第一种方式?为什么?
提前感谢您的回答。
答案 0 :(得分:24)
他们都完全一样。为方便起见,var
是语法糖。它与遍历List
的速度没有区别。
我遵循var
的经验法则是仅在赋值的右侧存在对象的类型时使用它,所以在这种情况下我宁愿明确指定键入foreach
以使其他工程师更清楚,但这取决于个人选择。如果将鼠标悬停在Visual Studio中的var
上,它将显示该类型(假设它可以推断出应该是什么)。
答案 1 :(得分:8)
引用MSDN:
隐式类型的局部变量是强类型的,就像你一样 我自己声明了类型,但编译器确定了类型。
所以
var i = 10; // implicitly typed
int i = 10; //explicitly typed
完全相同。
现在,为了'更好' - 它将在很大程度上取决于你的参数来判断它。如果是速度,则for
循环可能优于foreach
,T[]
优于List<T>
,according to Patrick Smacchia。要点:
for
循环比List上的foreach
循环便宜2倍多。foreach
在List上循环便宜5倍(我相信,这就是我们所做的)。答案 2 :(得分:3)
如果您比较IL代码,那么您将看到它们实际上是100%相同。
var
只是语法糖:
C#代码:
List<int> collection = new List<int>();
collection.Add(1);
collection.Add(2);
collection.Add(3);
foreach (var myInt in collection)
{
Console.WriteLine(myInt);
}
foreach (var T in collection)
{
Console.WriteLine(T);
}
bool flag;
System.Collections.Generic.List<int> list = new System.Collections.Generic.List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
System.Collections.Generic.List<int>.Enumerator enumerator = list.GetEnumerator();
try
{
while (flag)
{
int i1 = enumerator.get_Current();
System.Console.WriteLine(i1);
flag = enumerator.MoveNext();
}
}
finally
{
enumerator.Dispose();
}
enumerator = list.GetEnumerator();
try
{
while (flag)
{
int i2 = enumerator.get_Current();
System.Console.WriteLine(i2);
flag = enumerator.MoveNext();
}
}
finally
{
enumerator.Dispose();
}
答案 3 :(得分:1)
没有更快的方法来迭代同一个集合。
无论你使用什么,你自己的循环或扩展方法 - 这都是一样的。当你使用var
时 - 它仍会编译成相同的东西。
唯一的区别可能是,如果您使用词典,在搜索值方面会比List<T>
或Collection
更快。字典设计时带有搜索优化
答案 4 :(得分:0)
第一种方式(使用var)可能更好的可读性。 考虑一下:
List<User> list = new List<User>();
var users = list.GroupBy(x => x.Name).OrderBy(x => x.Key);
foreach (var user in users)
{
//blah
}
VS
foreach (System.Linq.IGrouping<string, User> user in users)
{
}
我认为这是首先使用var的主要原因。