La mia classe contiene un oggetto da Interop e chiama un metodo su di esso che lo induce ad allocare roba. Espone anche un metodo per liberare quella roba, quindi mi aspetto che dovrei chiamare questo in Dispose():Come si implementa il pattern di eliminazione in C# quando si avvolge un oggetto COM Interop?
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
Ora, dovrei espandi tutto quello di seguire il pattern Dispose. Non ho altre risorse monouso o non gestite per rilasciare, così assumendo comInstance è gestito (non è che quello che fa Interop, avvolge non gestito in gestito?), Penso che i disolves modello per:
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
Quali perdite a meno che non chiamare esplicitamente Dispose() su istanze di MyClass, che renderebbe il pattern Dispose difettoso? Quindi vuol dire comInstance deve essere gestito, e il modello disolves a:
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
EDIT:
- Per evitare di ingombrare la mia classe con il modello completo, potrei solo suggellare la mia classe?
- Come faccio a sapere che ComClassName (e in generale qualsiasi classe) non è gestito?
Meta-commento: assicurati che il tuo Dispose (bool) possa tollerare di essere chiamato più volte di seguito. Prova anche a minimizzare la possibilità che venga lanciata un'eccezione (non sempre possibile). – user7116
Commento meta-meta: oltre a questo, è importante non acquisire mai blocchi o utilizzare il blocco durante la pulizia non gestita. – womp