2014-09-22 2 views
-3

foreach Loops call .dispose() на объектах, которые реализуют IDisposable автоматически. Это хорошая особенность, но предположим, что вы имели следующую функцию:Правильный способ утилизации IDisposable COM Object Wrappers После цикла foreach Loop

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

    foreach(COMWrapper cw in COMWrapperList) 
    { 
     if(cw.name == COMWrapperName) 
      return cs; 
    } 
} 

И .dispose() метод COMWrapper «s выпустила это связано COM Object.

Как я понимаю, цикл foreach будет располагать каждый COMWrapper в конце цикла, но затем оставить согласованный COMWrapper, поскольку он был возвращен до достижения конца инструкции.

Это становится проблемой, однако, для ссылок COMWrapper, оставшихся в списке COMWrapperList, так как половина из них была удалена, когда их подстилающие обертки COM-объекта COM удалены без их удаления. Хуже того, Оставшаяся половина списка имеет полностью неуправляемые COM-объекты, которые теперь плавают в эфире, и поскольку объекты COMWrapper, которые они существуют, не были удалены, становится очень трудно пройти через List и вызвать .dispose() соответственно в заявлении finally (мы все же не хотим выпускать COM-объекты дважды).

Можно ли определить, был ли выпущен COM-объект, не перехватывая исключение ObjectDisposedException? Есть ли лучший способ избавиться от оставшихся COM-объектов и их оберток? Или, может быть, я абсолютно неправильно понимаю эту ситуацию и нуждаюсь в переоценке моего базового понимания COM-объектов, что я делаю неправильно?

+2

'foreach loops call .dispose() на объектах, которые реализуют IDisposable automaticall' Нет, это не так. – Servy

+0

Я полагаю, что это так ([Ссылка] (http://stackoverflow.com/questions/4982396/does-foreach-automatically-call-dispose)) –

+0

Ах, я вижу ваш ответ сейчас –

ответ

5

foreach не уничтожает все объекты в повторяющейся последовательности. Он имеет только объект IEnumerator, который предоставляет вам объекты, которые повторяются.