Pregunta

En mi código subyacente conecto mis eventos de esta manera:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    btnUpdateUser.Click += btnUpateUserClick;
}

Lo he hecho de esta manera porque eso es lo que he visto en los ejemplos.

  • ¿Es necesario llamar al método base.OnInit()?
  • ¿Se llamará implícitamente?
  • ¿Es mejor llamarlo al principio del método o al final?
  • ¿Cuál sería un ejemplo en el que la confusión sobre el método base puede causarle problemas?
¿Fue útil?

Solución

Debo aclarar:

Las pautas recomiendan que activar un evento debería implicar convocar un evento virtual "OnNombre del evento"método, pero también dicen que si una clase derivada anula ese método y olvida llamar al método base, el evento aún debería activarse.

Consulte la "Nota importante" aproximadamente a mitad de camino. esta página:

Las clases derivadas que anulan el método virtual protegido no necesitan llamar a la implementación de la clase base.La clase base debe seguir funcionando correctamente incluso si no se llama a su implementación.

Otros consejos

En este caso, si no llama a la base OnInit, entonces el Init ni siquiera se activará.

En general, lo mejor es llamar SIEMPRE al método base, a menos que sepa específicamente que no desea que se produzca el comportamiento base.

Si se llama al principio o al final depende de cómo quieras que funcionen las cosas.En un caso como este, donde se utiliza una anulación en lugar de conectar un controlador de eventos, llamarlo al inicio del método tiene más sentido.De esa manera, su código se ejecutará después de cualquier controlador, lo que hace que emule más un controlador de eventos "normal".

Aunque las pautas oficiales de diseño del marco recomiendan lo contrario, la mayoría de los diseñadores de clases en realidad harán que el método OnXxx() sea responsable de activar el evento real, de esta manera:

protected virtual void OnClick(EventArgs e)
{
    if (Click != null) Click(this, e);
}

...entonces, si heredas de la clase y no llamas a base.OnClick(e), el evento Click nunca se activará.

Entonces sí, aunque esto no debería Sea el caso según las pautas de diseño oficiales, creo que vale la pena llamar a base.OnInit(e) solo para estar seguro.

Las pautas oficiales de diseño del marco recomiendan lo contrario.

¿Ellas hacen?Tengo curiosidad, siempre he pensado lo contrario, y leer las Pautas de diseño del marco y ejecutar FxCop solo ha consolidado mi punto de vista.Tenía la impresión de que los eventos siempre deberían activarse desde métodos virtuales OnXxx(), que toman un parámetro EventArgs.

Probablemente sea mejor hacerlo de esa manera, entonces este debate desaparecerá.Sin embargo, el artículo es interesante, especialmente teniendo en cuenta que .NET Framework no respeta esta directriz.

@Ch00k y @Scott No sé, me gusta el OnNombre del evento patrón yo mismo.Y sí, soy una de las personas culpables de despedir el evento con ese método.

Creo que anular el método On* y llamar al método base es el camino a seguir.Manejar tus propios eventos parece incorrecto de alguna manera.

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