Este posible consejo rápido se convirtió en una respuesta larga. Lo siento.
Como señaló Tyler en su buena respuesta, llamar Dispose()es una gran práctica de programación. Esto se debe a que se supone que este método "reúne" toda la liberación de recursos necesaria para que no haya recursos abiertos innecesarios. Si escribió un texto en un archivo, por ejemplo, y no pudo cerrar el archivo (libere el recurso), permanecerá abierto y nadie más podrá escribir en él hasta que aparezca el GC y haga lo que debe hacer. hecho.
Ahora, en algunos casos habrá métodos de "finalización" más específicos para la clase con la que está tratando, como StreamWriter.Close(), que anula TextWriter.Close(). De hecho, por lo general son más adecuados para la situación: un StreamWriter Close(), por ejemplo, descarga el flujo y el codificador subyacente antes Dispose()del objeto. ¡Frio!
Sin embargo, al navegar por MSDN encontrará que incluso Microsoft a veces se confunde por la multitud de cerradores y trituradores. En esta página web , por ejemplo, en algunos ejemplos Close()se llama antes de lo implícito Dispose()(vea el uso de la declaración si no entiende por qué es implícito), y en uno en particular no se molestan. ¿Por qué sería eso? Yo también estaba perplejo.
La razón por la que pensé (y, enfatizo, esta es una investigación original y seguramente podría perder reputación si me equivoco) es que Close()podría fallar, produciendo una excepción al dejar recursos abiertos, mientras Dispose()que seguramente los liberaría . Es por ello que una Dispose()siempre debe salvaguardar una Close()llamada (perdón por el juego de palabras).
MyResource r = new MyResource();
try {
r.Write(new Whatever());
r.Close()
finally {
r.Dispose();
}
Y sí, supongo que Microsoft resbaló en ese ejemplo. Quizás esa marca de tiempo nunca se volcaría en el archivo.
Estoy arreglando mi viejo código mañana.
Editar: lo siento Brannon, no puedo comentar tu respuesta, pero ¿estás seguro de que es una buena idea llamar Close()a un finallybloque? Supongo que una excepción de eso podría arruinar el resto del bloque, que probablemente contendría un código de limpieza importante.
Responda a Brannon: genial, simplemente no olvide llamar Close()cuando sea realmente necesario (por ejemplo, cuando se trata de transmisiones, no sé mucho sobre conexiones SQL en .NET).