题
这甚至可能是一个连小学生都能回答的简单问题。
“ForEach”和“Using”有什么异同(采访中问到)。
我的假设是
1)两者都是可枚举的
2)using可以处理内存资源,但foreach不能。using支持IDisposable,foreach不能。
我想知道答案。
解决方案
相似之处:
- 它们都是逻辑代码扩展,提供其他复杂场景的样板代码
- 两者都涉及编译器引入的隐藏变量:分别用于一次性对象的迭代器和快照
但事情到这里就结束了……
using
需要IDisposable
;foreach
可能 触发自IEnumerable[<T>]
, ,但实际上是鸭子类型(你不需要IEnumerable
为了foreach
)using
有一个可预测的try
/finally
构造;foreach
可能 涉及一个Dispose()
如果迭代器是IEnumerable<T>
如果有的话,我会说 using
更接近于 lock
比 foreach
.
其他提示
- 没有
- 没有,
foreach
将处置你的IEnumerable
如果它实现IDisposable
.
using
定义一个范围,在该范围之外将放置一个或多个对象。它不会循环或迭代。
它们都有不同的用途。
foreach
用于枚举集合/数组中的项目。 using
是一个方便的结构,以确保您妥善处理您使用的东西。即使例如抛出异常。
这两种结构的相似之处是奇怪的。任何人都可以想到任何相似之处(除了非常明显的:'它们都是C#中的关键词')?
foreach
和using
之间的主要区别在于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);
}
}
不隶属于 StackOverflow