Foreach和Using之间的主要区别

时间:2009-10-22 15:05:06

标签: c# foreach

即使是男生也可以回答,这甚至可能是一个简单的问题。

“ForEach”和“Using”之间的相同点和不同点(在采访中询问)。

我的假设是

1)两者都是可枚举的

2)使用可以处理内存资源,但是foreach不能。使用支持IDisposable,foreach不能。

我想知道答案。

5 个答案:

答案 0 :(得分:8)

  1. 都能跟得上
  2. 如果foreach实施IEnumerableIDisposable会处置您的{{1}}。

答案 1 :(得分:4)

using定义了一个范围,在该范围之外将放置一个或多个对象。它不会循环或迭代。

答案 2 :(得分:4)

它们都有不同的用途。

foreach用于枚举集合/数组中的项目。 using是一种方便的结构,可确保您妥善处理您使用的物品。即使例如抛出异常。

这两种结构的相似之处是奇怪的。任何人都可以想到任何相似之处(除了非常明显的:'它们都是C#中的关键词')?

答案 3 :(得分:3)

foreachusing之间的主要区别在于foreach用于枚举IEnumerable,而using用于定义范围外其中一个物体将被处置。

foreachusing之间存在一个相似之处:枚举器实现IDisposable,而foreach将隐式包含using块中枚举数的使用。另一种说法是,foreach可以被重新编码为使用块,结果IL将是相同的。

代码块

var list = new List<int>() {1, 2, 3, 4, 5};
foreach(var i in list) {
    Console.WriteLine(i);
}

实际上与

相同
var list = new List<int>() {1, 2, 3, 4, 5};
using (var enumerator = list.GetEnumerator()) {
    while (enumerator.MoveNext()) {
        Console.WriteLine(enumerator.Current);
    }
}

答案 4 :(得分:3)

相似点:

  • 它们都是逻辑代码扩展,提供其他复杂场景的样板代码
  • 都涉及编译器引入的隐藏变量:分别用于迭代器和一次性对象的快照

但这就是结束的地方......

  • using 要求 IDisposable; foreach 可能IEnumerable[<T>]触发,但实际上是鸭子类型(IEnumerable不需要foreach
  • using具有可预测的try / finally结构;如果迭代器为foreach,则Dispose() 可能涉及IEnumerable<T>

如果有的话,我会说using更接近lock而不是foreach