Pergunta

No meu código por trás eu conecto meus eventos assim:

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

Fiz assim porque foi o que vi nos exemplos.

  • O método base.OnInit() precisa ser chamado?
  • Será implicitamente chamado?
  • É melhor chamá-lo no início ou no final do método?
  • Qual seria um exemplo em que a confusão sobre o método básico pode causar problemas?
Foi útil?

Solução

Devo esclarecer:

As diretrizes recomendam que o disparo de um evento envolva a convocação de um evento virtual "OnNome do evento", mas eles também dizem que se uma classe derivada substituir esse método e esquecer de chamar o método base, o evento ainda deverá ser acionado.

Veja a "Nota Importante" na metade do caminho esta página:

As classes derivadas que substituem o método virtual protegido não são obrigadas a chamar a implementação da classe base.A classe base deve continuar funcionando corretamente mesmo que sua implementação não seja chamada.

Outras dicas

Nesse caso, se você não chamar o OnInit base, o Init ainda não será acionado.

Em geral, é uma prática recomendada SEMPRE chamar o método base, a menos que você saiba especificamente que não deseja que o comportamento base ocorra.

Se é chamado no início ou no final depende de como você deseja que as coisas funcionem.Em um caso como este, onde você está usando uma substituição em vez de conectar um manipulador de eventos, chamá-lo no início do método faz mais sentido.Dessa forma, seu código será executado após qualquer manipulador, o que faz com que ele emule mais um manipulador de eventos "normal".

Embora as diretrizes oficiais de design da estrutura recomendem o contrário, a maioria dos designers de classes tornará o método OnXxx() responsável por disparar o evento real, assim:

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

...portanto, se você herdar da classe e não chamar base.OnClick(e), o evento Click nunca será acionado.

Então sim, mesmo que isso não deveria seja o caso de acordo com as diretrizes oficiais de design, acho que vale a pena chamar base.OnInit(e) só para ter certeza.

as diretrizes oficiais de design da estrutura recomendam o contrário

Eles fazem?Estou curioso, sempre pensei o contrário, e ler as Diretrizes de Design da Estrutura e executar o FxCop apenas consolidou minha visão.Fiquei com a impressão de que os eventos deveriam sempre ser disparados a partir de métodos virtuais OnXxx(), que usam um parâmetro EventArgs

Provavelmente é melhor fazer assim, então esse debate desaparece.O artigo é interessante, especialmente considerando que o .NET Framework não respeita esta diretriz.

@Ch00k e @Scott, não sei - gosto do OnNome do evento me modelar.E sim, sou uma das pessoas culpadas de disparar o evento com esse método.

Acho que substituir o método On* e chamar o método base é o caminho a seguir.Lidar com seus próprios eventos parece errado de alguma forma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top