C# 在foreach循环后处理IDisposable COM对象包装的正确方法

C# 在foreach循环后处理IDisposable COM对象包装的正确方法,c#,foreach,com,idisposable,rcw,C#,Foreach,Com,Idisposable,Rcw,foreach循环在自动实现IDisposable的对象上调用.dispose()。这是一个不错的功能,但假设您具有以下功能: public COMWrapper GetCOMWrapperByName(string COMWrapperName) { List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace(); foreach(COMWrapper cw in COMWrapperList) {

foreach
循环在自动实现
IDisposable
的对象上调用
.dispose()
。这是一个不错的功能,但假设您具有以下功能:

public COMWrapper GetCOMWrapperByName(string COMWrapperName)
{
    List<COMWrapper> COMWrapperList = GetCOMWrappersFromPlace();

    foreach(COMWrapper cw in COMWrapperList)
    {
        if(cw.name == COMWrapperName)
            return cs;
    }
}
public-COMWrapper-GetCOMWrapperByName(字符串COMWrapperName)
{
List COMWrapperList=GetCOMWrappersFromPlace();
foreach(COMWrapperList中的COMWrapper cw)
{
如果(cw.name==COMWrapperName)
返回cs;
}
}
COMWrapper
.dispose()
方法释放了它的相关COM对象

据我所知,foreach循环将在循环结束时处理每个
COMWrapper
,但随后保留匹配的
COMWrapper
,因为它是在到达语句结尾之前返回的

然而,对于
COMWrapperList
列表中剩余的
COMWrapper
引用来说,这就成了一个问题,因为其中有一半的引用在未处理的情况下已移除了其底层COM对象RCW包装。更糟糕的是,列表的另一半有完全非托管的COM对象,现在漂浮在以太网上,而且由于它们所存在的
COMWrapper
对象还没有被处理,因此很难遍历
列表
并在
finally
语句中适当地调用
.dispose()
(毕竟,我们不想两次发布COM对象)


是否有可能确定COM对象是否在未捕获
ObjectDisposedException
异常的情况下被释放?是否有更好的方法来处理剩余的COM对象及其包装器?或者可能我完全误解了这种情况,需要重新评估我对COM对象的基本理解,我做错了什么?
foreach
不会处理被迭代序列中的所有对象。它只处理为您提供被迭代对象的
IEnumerator
对象。

foreach循环调用。dispose()对实现IDisposable automaticall的对象执行(
不。我相信它不会。)啊,我明白你的答案了now@SandyGifford枚举数将被释放,而不是集合中的每个对象。您需要更仔细地阅读链接,因为它没有说明您所声称的内容。