Moja klasa zawiera obiekt z Interop i wywołuje na nim metodę, która powoduje przydzielanie rzeczy. naraża to także sposób, aby uwolnić te rzeczy, więc spodziewam powinienem nazwać to w Dispose():Jak zaimplementować wzorzec dispose w języku C# podczas owijania obiektu COM Interop?
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
Teraz muszę poszerzyć wszystko, aby podążać za Dispose wzór. Nie mam żadnych innych środków jednorazowych lub niezarządzalny do wydania, więc zakładając comInstance jest zarządzany (nie jest to, co robi Interop, okłady niekontrolowana się udało?), Myślę, że disolves wzorzec:
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
z wyciekiem, chyba że jawnie wywołać Dispose() na instancjach MyClass, co spowodowałoby wadliwy wzór Dispose? Więc to znaczy comInstance musi być niekontrolowana, a wzór disolves do:
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
EDIT:
- Aby uniknąć zaśmiecania moją klasę z pełnym wzorem, może po prostu zamknąć moją klasę?
- Skąd wiadomo, że ComClassName (i ogólnie każda klasa) jest niezarządzana?
Meta-komentarz: upewnij się, że Twój Dispose (bool) może znieść wielokrotne wywoływanie. Spróbuj także zminimalizować możliwość wyrzucania wyjątku (nie zawsze jest to możliwe). – user7116
Meta-meta comment - a także, że ważne jest, aby nigdy nie zdobywać blokad ani nie używać blokady podczas niezarządzanego czyszczenia. – womp