这甚至可能是一个连小学生都能回答的简单问题。

“ForEach”和“Using”有什么异同(采访中问到)。

我的假设是

1)两者都是可枚举的

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

我想知道答案。

有帮助吗?

解决方案

相似之处:

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

但事情到这里就结束了……

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

如果有的话,我会说 using 更接近于 lockforeach.

其他提示

  1. 没有
  2. 没有, foreach 将处置你的 IEnumerable 如果它实现 IDisposable.

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

它们都有不同的用途。

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

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

foreachusing之间的主要区别在于IEnumerable用于枚举IDisposable,而<=>用于定义将在其外部放置对象的范围。

<=>和<=>之间有一个相似之处:枚举器实现<=>,<=>将隐式地在<=>块中包含枚举器的使用。另一种说法是,<=>可以被重新编码为使用块,结果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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top