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-объектов, что я делаю неправильно?
'foreach loops call .dispose() на объектах, которые реализуют IDisposable automaticall' Нет, это не так. – Servy
Я полагаю, что это так ([Ссылка] (http://stackoverflow.com/questions/4982396/does-foreach-automatically-call-dispose)) –
Ах, я вижу ваш ответ сейчас –