No, .Net y hense C# se basan en una gestión de memoria de recolección de basura. Por lo tanto, los destructores (que en .Net se llaman finalizadores) no se invocan hasta que GC considere apropiado destruir los objetos.
Además: la mayoría de los objetos "regulares" en C# no tienen destructores. Si necesita el patrón de destructor, debe implementar el IDisposable interface con el Dispose Pattern. En objetos desechables también debe asegurarse de que se llame al método Dispose, ya sea con el using keyword o llamando directamente al método.
Para aclarar (con suerte): la eliminación determinista es útil en .Net, p. cuando necesite liberar recursos explícitamente que no estén administrados por el tiempo de ejecución .Net. Ejemplos de tales recursos son manejadores de archivos, conexiones de bases de datos, etc. Por lo general, es importante que estos recursos se liberen tan pronto como ya no se necesiten. Por lo tanto, no podemos permitirnos esperar a que el CG los libere.
Para obtener una eliminación determinista (similar al comportamiento del alcance de C++) en el mundo no determinista del .Net GC, las clases .Net se basan en la interfaz IDisposable. Préstamos del Dispose Pattern, he aquí algunos ejemplos:
En primer lugar, crear instancias de un recurso desechable y luego dejar que el objeto vaya fuera de alcance, lo dejará hasta la GC para disponer del objeto:
1. {
2. var dr = new DisposableResource();
3. }
Para Solucionar este que puede disponer de forma explícita el objeto:
1. {
2. var dr = new DisposableResource();
3.
4. ...
5.
6. dr.Dispose();
7. }
Pero lo que si algo va mal entre la línea 2 y 6? Eliminar no se llamará. Para garantizar aún más que botar finalmente se llamará independientemente de las excepciones que podemos hacer lo siguiente:
1. var dr = new DisposableResource();
2. try
3. {
4. ...
5. }
6. finally
7. {
8. dr.Dispose();
9. }
Dado que este patrón es a menudo necesaria, C# incluye el uso de palabras clave para simplificar las cosas. El siguiente ejemplo es equivalente al anterior:
1. using (var dr = new DisposableResource())
2. {
3. ...
4. }
@RA - lo siento por el retraso, tenían alguna IRL tareas pendientes :) Agregué algunos ejemplos ahora, espero que esto aclare aún más. –