Как реализовать шаблон dispose в c # при переносе COM-объекта Interop?
Мой класс содержит объект из Interop и вызывает для него метод, который заставляет его распределять вещи. Он также предоставляет метод для освобождения этого материала, поэтому я ожидаю, что я должен вызвать его в Dispose ():
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
Теперь я должен расширить все это, чтобы следовать шаблону Dispose. У меня нет других одноразовых или неуправляемых ресурсов для освобождения, поэтому, если предположить, что comInstance является управляемым (разве не то, что делает Interop, а неуправляемый превращается в управляемый?), Я думаю, что шаблон распадается на:
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
Какие утечки, если я явно не вызову Dispose () для экземпляров MyClass, что сделает шаблон Dispose некорректным? Значит ли это, что comInstance должен быть неуправляемым, а шаблон -
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
EDIT:
To avoid cluttering my class with the full pattern, could I just seal my class? How do I know ComClassName (and in general any class) is unmanaged?