2009-09-25 14 views
13

¿Para qué sirven realmente los eventos protegidos o privados (no estáticos) en .NET?¿Qué casos de uso existen para eventos privados o protegidos no estáticos?

Parece que cualquier evento privado o protegido se maneja más fácilmente a través de un método virtual. Puedo (algo) ver la necesidad de esto en eventos estáticos, pero no para eventos normales.

¿Ha tenido antes un caso de uso que demuestre claramente una necesidad o ventaja para un evento privado no protegido o estático?

+0

Interesado en ver las respuestas yo mismo. ¡Haz tu caso! –

Respuesta

6

Me parece que un buen ejemplo de cómo un evento privado es útil es en la construcción de componentes/control, a menudo puede tener un componente compuesto por uno o más componentes, eventos privados que contengan componentes pueden suscribirse a es una implementación práctica y fácil de un patrón de observador.

Editar:

te voy a dar un ejemplo ...

Digamos que está escribiendo un control de tipo rejilla, y en el interior de este control lo más probable es tener un montón de clases de contenidos que se crean dinámicamente Filas, columnas, encabezados, etc. por ejemplo, quiere notificar a estas clases contenidas que algo que les importa ha sucedido, digamos un cambio de Skinning o algo así, algo que no necesariamente quiere exponer como un evento a la grilla usuarios, aquí es donde los eventos privados son útiles, simplemente tienen uno o dos controladores y a medida que crea cada instancia de su fila o col o lo que sea, adjunte el controlador, ya que de lo contrario solo tiene que escribirle Tiene un mecanismo propio de observación, no es difícil, pero por qué cuando no es necesario y simplemente puede usar eventos de multidifusión.

+0

Para que el componente funcione, ¿no necesitarían los elementos individuales tener eventos públicos (o al menos internos)? ¿Cómo se va a suscribir el "componente compuesto" a un evento privado o protegido en su (s) parte (s)? –

+0

Las clases contenidas son solo eso, incluidas, por lo que están dentro del alcance de la clase que define el evento privado. –

+0

Oh, ¿estás pensando específicamente en un componente definido como una clase anidada, entonces? –

7

Aquí hay un escenario un tanto extraño pero real que implementé una vez. Tiene mitades generadas por la máquina y generadas por el usuario de una clase parcial. La mitad generada por la máquina contiene un código que desea informar a la mitad generada por el usuario cuando ocurre algún evento. Pero la mitad generada por el usuario podría no importar hacer nada, o podría importarle bastante. Parece descortés que la mitad generada por la máquina requiera que la mitad generada por el usuario implemente un método particular para manejar un mensaje que no tienen ningún interés en escuchar.

Para resolver este problema, la mitad generada por la máquina podría disparar en un evento privado. Si la mitad se preocupa por el usuario, puede suscribirse al evento. Si no, puede ignorarlo.

Este escenario ahora se trata de manera más elegante mediante métodos parciales en C# 3, pero esa no era una opción en el día.

+0

Muy interesante, aunque estoy de acuerdo en que los métodos parciales son probablemente una opción más interesante en la plataforma actual. –

+0

Por cierto, cuando diseñamos por primera vez esa arquitectura, VB no admitía realmente escuchar sus propios eventos. Yo creo que ahora. –

1

Los tipos anidados tienen acceso a los eventos privados y protegidos del tipo adjunto. Utilicé esta función para notificar los controles secundarios (el tipo anidado) de los cambios de estado en el control principal (el tipo adjunto) en una aplicación de Silverlight.

0

sentimos que arrastrar hasta un viejo hilo, pero yo uso eventos privados con impunidad en uno de mis proyectos, y personalmente, me parece que es una buena manera de resolver un problema de diseño:

Aquí está el código abreviado:

public class MyClass 
{ 
    private event EventHandler _myEvent; 

    public ExternalObject { get; set; } 

    public event EventHandler MyEvent 
    { 
    add 
    { 
     if (_myEvent.GetInvocationList().Length == 0 && value != null) 
     ExternalObject.ExternalEvent += HandleEvent; 
     _myEvent+= value; 
    } 
    remove 
    { 
     _myEvent-= value; 
     if (_myEvent.GetInvocationList().Length == 0) 
     ExternalObject.ExternalEvent -= HandleEvent; 
    } 
    } 

    private void HandleEvent(object sender, EventArgs e) 
    { 
    _myEvent.Raise(this, EventArgs.Empty); // raises the event. 
    } 
} 

Básicamente, MyEvent es sólo alguna vez se crió en el controlador de eventos de ExternalObject.ExternalEvent, por lo que si no hay controladores para MyEvent entonces no es necesario adjuntar un controlador al evento externo, acelerando ligeramente el código al guardar una marco de pila.

0

No solo la instancia actual puede acceder a un miembro privado. ¡Otras instancias del mismo tipo también pueden!Esto permite algunos escenarios donde este control de acceso puede ser útil.

Estoy pensando en una estructura de árbol donde todos los nodos heredan un cierto tipo y un evento privado/protegido permite propagar eventos de hoja a sus padres. Como son del mismo tipo, el padre puede registrarse en el evento privado del niño. Sin embargo, cualquier cliente de la estructura del árbol no puede.

Definitivamente puedo ver un caso de uso en un directorio como el sistema de almacenamiento, donde cada directorio necesita para propagar su última fecha de modificación a su principal, por ejemplo.

Cuestiones relacionadas