En un patrón IDisposable debe una clase base permiten clases para compartir su bandera dispuesta derivado?

StackOverflow https://stackoverflow.com/questions/1079752

  •  21-08-2019
  •  | 
  •  

Pregunta

Actualmente estoy trabajando en la fijación de una base de código C # que no tiene un buen patrón de uso Desechar.

Es una gran base de código, es una base de código que requiere muchos recursos y usa muchos ++ bibliotecas personalizadas no administrados c en el nivel bajo.

Tengo un buen entendimiento del patrón de disponer. He pasado algún tiempo entender lo que creo que es el estándar de oro artículo sobre el tema: Joe Duffy disponer artículo

En un intento de minimizar la duplicación de código, hemos considerado algunas clases de ayuda de tener, y por eso mi pregunta:

Si una clase base implementa un patrón Desechar estándar debería permitir su bandera dispuesta para ser compartido es decir. marcado como protegido?

Para aclarar quiero decir debe no solamente ser un solo estado booleano dentro de una jerarquía de herencia que define si una instancia de objeto se ha dispuesto, o debe haber un valor booleano privado en cada paso de la escalera herencia?

Los ejemplos de MSDN y en el enlace anterior establece un indicador en cada nivel, pero nunca explican el razonamiento detrás de él. Estoy en dos mentes sobre el tema, ¿cuáles son sus pensamientos y razones?

¿Fue útil?

Solución

Yo diría que no, no debe compartir la bandera. Compartiendo la bandera crea oportunidades para el fracaso que podría prevenir mejor encapsulación.

Por ejemplo, considere la situación donde usted tiene una propiedad de sólo lectura Dispuesta sobre la base de la mayoría de clase. El campo de respaldo solamente se establece en true en el método Dispose (eliminación) en la clase base. Esto significa que la propiedad Dispuesta tan sólo puede devolver verdadero si el Desechar clase base se llama (salvo la reflexión del mal, por supuesto). Esto permite que la clase base para proporcionar un contrato de cumplimiento obligatorio.

Ahora considere lo contrario, donde hay un colocador protegida. Cualquier clase puede ahora establecer arbitrariamente la propiedad Dispuesta a ciertas sin desechar nada. Esto crea una oportunidad para volver a botar cierto cuando no se dispone.

Yo elegiría la primera opción, ya que proporciona el contrato más exigible.

Otros consejos

Yo recomendaría tener una propiedad dispuesta en la clase base con un captador público y un colocador protegida.

En el caso de que tenga métodos que deben hacer algo diferente cuando la clase se ha dispuesto, por ejemplo, lanzar una excepción, me gustaría crear una propiedad sólo protegió getter para la clase base que lee el campo privado en la clase base. De esta manera se permite que ningún heredero para saber si él es capaz de realizar una operación.

A continuación, para saber si una clase ya se ha dispuesto en su propio método dispose (por ejemplo: para evitar la liberación de recursos dos veces), creo que tener una bandera privada es mejor para una mayor claridad y mantenimiento

.

Además de la respuesta de JaredPar, me gustaría añadir que no siempre es necesario para que haya un _disposed bandera. Muy a menudo, los demás campos "relacionados con los recursos" del objeto, naturalmente, proporcionan una manera de representar el estado dispuesta.

Por ejemplo, un objeto COM externo que necesita ser Shutdown antes de que se descarta estaría representada por una referencia al objeto COM, y así la parte pertinente del Dispose sería:

if (_comObject != null)
{
    _comObject.Shutdown();
    _comObject = null;
}

Esta seguridad se puede ejecutar varias veces sin llamar NullReferenceException más de una vez, como se requiere. Otros métodos que intentan utilizar _comObject después ObjectDisposedException recibirá una <=>, o, idealmente, esos métodos sería comprobar el campo _comObject y tirar <=>.

Me parece que esto es más cierto que a menudo no - con frecuencia haber implementado IDisposable, no puedo recordar haber necesidad de un <=> campo separado. La introducción de uno podría aumentar los grados de libertad (aumentar el número de maneras para mí para meter la pata).

Así que esto es poco probable que sea útil para que las clases derivadas incluso si era una idea segura (que no lo es, como explica JaredPar).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top