¿Cuál es la diferencia, si existe, entre un destructor y un método Finalize en una clase?En C# ¿cuál es la diferencia entre un destructor y un método Finalize en una clase?
Recientemente descubrí que Visual Studio 2008 considera un destructor sinónimo de un método Finalize, lo que significa que Visual Studio no le permitirá definir simultáneamente ambos métodos en una clase.
Por ejemplo, el siguiente fragmento de código:
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
da el siguiente error en la llamada para finalizar en el destructor:
The call is ambiguous between the following methods or properties: 'TestFinalize.~TestFinalize()' and 'TestFinalize.Finalize()'
Y si la llamada para finalizar se comenta, se da el siguiente error:
Type 'ManagementConcepts.Service.TestFinalize' already defines a member called 'Finalize' with the same parameter types
'Solo debe implementar un método Finalize para limpiar los recursos no administrados': lo pone en Finalizar. Lo mismo con deshacerse? – hqt
@hqt: Los casos en los que uno debería implementar 'Dispose' son mucho más numerosos que los que debería implementar un finalizador. Implemente 'Dispose' si es probable que una instancia de la clase o una clase derivada sea lo último que posea directamente un recurso no administrado, o que posea directamente lo último para poseer directamente un recurso no administrado, o que posea directamente lo último para poseerlo directamente, etc. Implemente 'Finalize' solo para la limpieza de recursos si la clase de uno directamente posee un recurso no administrado y casi nada más --un escenario mucho más estrecho. – supercat
@hqt: si una clase posee directamente recursos no administrados y también contiene referencias a otros objetos, los recursos no administrados generalmente deberían dividirse en su propia clase finalizable (que idealmente no debería tener ninguna referencia fuerte a otra cosa), lo que significa que la clase que contiene referencias a otros objetos solo sería propietaria de "cosas que poseen directamente recursos no administrados", en lugar de poseer los recursos por sí mismos, y por lo tanto no necesitaría un finalizador. – supercat