foreach
循环在自动实现.dispose()
的对象上调用IDisposable
。这是一个很好的功能,但是我们说你有以下功能:
public COMWrapper GetCOMWrapperByName(string COMWrapperName)
{
List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace();
foreach(COMWrapper cw in COMWrapperList)
{
if(cw.name == COMWrapperName)
return cs;
}
}
COMWrapper
.dispose()
方法释放了它的相关COM对象。
根据我的理解,foreach循环会在循环结束时处理每个COMWrapper
,但随后在匹配COMWrapper
之前离开匹配的COMWrapper
。< / p>
然而,对于COMWrapperList
列表中留下的COMWrapper
引用,这成为一个问题,因为它们中的一半已经删除了它们的底层COM对象RCW包装器而没有被丢弃。更糟糕的是,剩余的一半列表中有完全不受管理的COM对象现在漂浮在以太网中,并且由于它们存在的List
个对象已被处理掉,因此遍历{{1}变得非常困难并在.dispose()
语句中适当地调用finally
(毕竟,我们不想释放COM对象两次)。
是否可以确定是否已释放COM对象而未捕获ObjectDisposedException
异常?是否有更好的方法来处理剩余的COM对象及其包装器?或者我可能完全误读了这种情况,需要重新评估我对COM对象的基本理解,我做错了什么?
答案 0 :(得分:5)
foreach
不会处理正在迭代的序列中的所有对象。它只处理 IEnumerator
对象,它为您提供迭代的对象。