variable usa tipo pero locales las inicializar implícito implicitas deben conversiones con como c# idisposable explicit-interface

c# - usa - las variables locales con tipo implícito se deben inicializar



¿Por qué una clase implementaría IDisposable explícitamente en lugar de implícitamente? (4)

Estaba usando la clase FtpWebResponse y no vi un método de FtpWebResponse . Resulta que la clase implementa IDisposable, pero lo hace explícitamente para que primero deba convertir su instancia en IDisposable antes de llamar a Dispose:

// response is an instance of FtpWebResposne ((IDisposable) response).Dispose();

¿Por qué el diseñador de una clase como esta elige implementar IDisposable explícitamente? Como dice Anthony Pegram , hacer las cosas de esta manera enmascara el hecho de que el objeto debe eliminarse para el desarrollador promedio que no consulta la documentación cada vez que usa una clase.


Además de lo que se ha dicho, podría sugerir que la implementación de IDisposable fomenta explícitamente el uso del bloque de using , ya que se puede usar en cualquier tipo que implemente IDisposable y es más natural (para la mayoría de las personas) escribir esto:

using (var response = GetResponse()) { // do something }

Que esto:

var response = GetResponse(); // do something ((IDisposable)response).Dispose();

No estoy seguro de que esa sea la intención de un desarrollador al implementar IDisposable explícitamente, pero es posible.


Es un poco raro mirarme a mí también. Para lo que vale la pena: la clase base (WebResponse) implementa un método Close (). Reflector muestra que el método Dispose () de WebResponse simplemente llama a Close () y a un OnDispose virtual virtual que no hace nada.

Tengo que confesar que me huele un poco, pero apuesto a que implementaron explícitamente IDisposable para que no haya confusión en Intellisense entre llamar a Close () o Dispose ().


Esto normalmente se hace si la clase tiene un método de Close que es exactamente igual a Dispose . El Dispose original está oculto en una implementación explícita para que el mismo método exacto no tenga dos nombres.

Se recomienda oficialmente aquí:

Implemente un método de cierre con fines de limpieza si dicha terminología es estándar, por ejemplo, como con un archivo o socket. Al hacerlo, se recomienda que haga que la implementación Cerrar sea idéntica a la de Dispose ...

Considere implementar miembros de la interfaz explícitamente para ocultar un miembro y agregar un miembro equivalente con un nombre mejor.

Ocasionalmente, un nombre específico del dominio es más apropiado que Dispose. Por ejemplo, una encapsulación de archivos podría querer usar el nombre del método Cerrar. En este caso, implemente Dispose de forma privada y cree un método de cierre público que llame a Dispose.

(PS no estoy de acuerdo con esta convención.)


  • Ocasionalmente, una clase tendrá un método de Disposición que es parte de la interfaz pero que en realidad no necesita ser llamado porque el único recurso para deshacerse de él es la memoria: MemoryStream, por ejemplo.
  • Como lo mencionaron otros, si la clase tiene un método Cerrar que hace lo mismo que Dispose, posiblemente Dispose solo debe existir para admitir el patrón de "uso", por lo que también puede ser explícito.