展望method
的实施void InsertRange(int index, IEnumerable<T> collection)
列表中的&lt;&gt; class(.NET Framework 4.5.2),我可以看到像这样的集合的迭代
using(IEnumerator<T> en = collection.GetEnumerator()) {
while(en.MoveNext()) {
Insert(index++, en.Current);
}
}
我想知道在这一个
上更喜欢这种语法的原因是什么foreach(var item in collection)
{
Insert(index++, item)
}
我使用不同的方法创建了一个包含两个方法的程序集。然后,查看生成的IL代码,我可以看到两个方法调用由IEnumerator<T>
的实现强制执行的Dispose方法,因此IDisposable
。
所以IDisposable
不是原因,这是我的问题。
除了简单的样式(ish)首选项之外,是否有理由更喜欢一种语法而不是另一种语法?
答案 0 :(得分:5)
foreach是推荐的方式,因为您没有指定有关如何迭代枚举的详细信息。此外,您编写的代码更少,而且更具可读性。
答案 1 :(得分:3)
它们完全等同,它是一种叫做 syntactic sugar 的东西。使用foreach
的唯一原因是因为它更短,更不容易出错,更具可读性等。
您可以查看有关MSDN上foreach
实施的文章。
答案 2 :(得分:0)
for循环比foreach循环更快。现在差异很小,所以通常甚至都不值得考虑。我认为.net的早期版本存在更大的差异。
答案 3 :(得分:0)
任何继承自IEnumerable<T>
(可枚举对象)的集合都可以使用foreach循环进行枚举。
考虑这个例子:
foreach(char c in "Ehsan")
{
Console.WriteLine(c);
}
基本上是一种迭代IEnumerable<T>
的高级方法,如果枚举器实现iDisposable
,foreach
语句使用using
语句,它将勉强地处理枚举器对象
在较低的水平,我们可以做到:
using(var enumerator = "Ehsan".GetEnumerator())
{
while(enumerator.MoveNext())
{
var element = enumerator.Current;
Console.WriteLine(element);
}
}
所以foreach
正在为你工作,你不必像上面这样写一下来枚举IEnumeable<T>