在C#中,foreach循环会自动调用实现IDisposable接口的任何对象的Dispose方法吗?
http://msdn.microsoft.com/en-us/library/aa664754(v=vs.71).aspx似乎表明它确实会这样做:
否则,集合表达式是实现System.IEnumerable类型的,foreach语句的扩展为: Copy
否则,集合表达式是实现System.IEnumerable类型的,foreach语句的扩展为: Copy
IEnumerator enumerator =
((System.Collections.IEnumerable)(collection)).GetEnumerator();
try {
while (enumerator.MoveNext()) {
ElementType element = (ElementType)enumerator.Current;
statement;
}
}
finally {
IDisposable disposable = enumerator as System.IDisposable;
if (disposable != null) disposable.Dispose();
}
GetEnumerator
方法返回的类型是接口,foreach
方法只会在运行时检查返回对象是否实现了IDisposable
,以决定是否调用Dispose
方法。否则,编译器将在编译时决定是否调用Dispose
方法。特别地,如果返回类型是一个可继承的类且未实现IDisposable
接口,则即使该对象实现了IDisposable
接口也不会被处理。 - supercatE enumerator
是一个final class
并且没有实现IDisposable
时,实现可以被优化,"在这种情况下,实现可以安全地优化整个 finally 子句。"(=不调用.Dispose()
)。但是我看不到任何可能出现E enumerator
确实实现了IDisposable
,但.Dispose()
没有被调用的情况。 - BatteryBackupUnitFor Each
的行为与描述的相同。 - supercat