Mi clase contiene un objeto de Interop y llama a un método que le permite asignar cosas. También expone un método para liberar esas cosas, así que espero que debería informar de esto a Dispose():¿Cómo implemento el patrón de disposición en C# al envolver un objeto COM de Interop?
class MyClass : IDisposable
{
private DllName.ComClassName comInstance;
void SomeMethod()
{
comInstance = new DllName.ComClassName();
comInstance.AllocStuff();
}
public void Dispose()
{
comInstance.FreeThatStuff();
}
}
Ahora, debería ampliar todo lo que de seguir el patrón Dispose. No tengo otros recursos desechables o no administrados para liberar, por lo que suponiendo comInstance es gestionado (no es que lo hace de interoperabilidad, envolturas no administrado en gestionados?), Creo que los disolves patrón a:
public void Dispose()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
Que escape a menos que yo Llamar explícitamente a Dispose() en instancias de MyClass, lo que haría que el patrón Dispose sea defectuoso. ¿Significa eso que comInstance debe ser administrado, y el patrón de disolves:
public void Dispose()
{
DisposeComInstance();
GC.SuppressFinalize(this);
}
~MyClass()
{
DisposeComInstance();
}
private void DisposeComInstance()
{
if (comInstance != null)
{
comInstance.FreeStuff();
comInstance = null;
}
}
EDIT:
- Para evitar llenar mi clase con el patrón completo, podría simplemente sellar mi clase?
- ¿Cómo sé que ComClassName (y en general cualquier clase) no está administrado?
Meta-comentario: asegúrese de que su Dispose (bool) puede tolerar que lo llamen muchas veces seguidas. También trate de minimizar la posibilidad de que se produzca una excepción (no siempre es posible). – user7116
Comentario de meta-meta: además de eso, es importante que nunca adquiera cerraduras ni use el bloqueo durante su limpieza no administrada. – womp