-3

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然而,对于列表中留下的引用来说,这成为一个问题,COMWrapperList因为其中一半的底层 COM 对象 RCW 包装器已被删除,而它们本身并未被处理掉。更糟糕的是,列表的剩余一半完全不受管理的 COM 对象现在漂浮在以太中,并且由于COMWrapper它们存在的对象尚未被处理,因此很难在语句中适当地遍历List和调用(我们不t,毕竟要释放COM Objects两次)。.dispose()finally

是否可以在不捕获异常的情况下确定 COM 对象是否已被释放ObjectDisposedException?有没有更好的方法来处理剩余的 COM 对象及其包装器?或者,也许我完全误读了这种情况,需要重新评估我对 COM 对象的基本理解,我做错了什么?

4

1 回答 1

5

foreach不会处理被迭代序列中的所有对象。它只处理为您提供被迭代对象的对象IEnumerator

于 2014-09-22T18:08:42.467 回答