C # 2008
He estado trabajando en esto por un tiempo, y todavía estoy confundido sobre el uso de los métodos de finalizar y desechar en el código. Mis preguntas están abajo:
Sé que solo necesitamos un finalizador mientras desechamos recursos no administrados. Sin embargo, si hay recursos administrados que hacen llamadas a recursos no administrados, ¿aún necesitaría implementar un finalizador?
Sin embargo, si desarrollo una clase que no usa ningún recurso no administrado, directa o indirectamente, ¿debo implementar el
IDisposable
para permitir que los clientes de esa clase usen la 'declaración de uso'?¿Sería factible implementar IDisposable solo para permitir que los clientes de su clase utilicen la instrucción using?
using(myClass objClass = new myClass()) { // Do stuff here }
He desarrollado este simple código a continuación para demostrar el uso Finalizar / eliminar:
public class NoGateway : IDisposable { private WebClient wc = null; public NoGateway() { wc = new WebClient(); wc.DownloadStringCompleted += wc_DownloadStringCompleted; } // Start the Async call to find if NoGateway is true or false public void NoGatewayStatus() { // Start the Async's download // Do other work here wc.DownloadStringAsync(new Uri(www.xxxx.xxx)); } private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { // Do work here } // Dispose of the NoGateway object public void Dispose() { wc.DownloadStringCompleted -= wc_DownloadStringCompleted; wc.Dispose(); GC.SuppressFinalize(this); } }
Pregunta sobre el código fuente:
Aquí no he agregado el finalizador, y normalmente el GC llamará al finalizador, y el finalizador llamará a Dispose. Como no tengo el finalizador, ¿cuándo llamo al método Dispose? ¿Es el cliente de la clase quien debe llamarlo?
Entonces, mi clase en el ejemplo se llama NoGateway y el cliente podría usar y deshacerse de la clase de esta manera:
using(NoGateway objNoGateway = new NoGateway()) { // Do stuff here }
¿Se llamará automáticamente al método Dispose cuando la ejecución llegue al final del bloque de uso, o el cliente tiene que llamar manualmente al método dispose? es decir
NoGateway objNoGateway = new NoGateway(); // Do stuff with object objNoGateway.Dispose(); // finished with it
Estoy usando la
WebClient
clase en miNoGateway
clase. Debido a queWebClient
implementa laIDisposable
interfaz, ¿significa esto queWebClient
indirectamente usa recursos no administrados? ¿Existe una regla difícil y rápida para seguir esto? ¿Cómo sé que una clase usa recursos no administrados?