Domanda

Nel mio codice collego i miei eventi in questo modo:

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

L'ho fatto in questo modo perché è quello che ho visto negli esempi.

  • È necessario chiamare il metodo base.OnInit()?
  • Verrà chiamato implicitamente?
  • È meglio chiamarlo all'inizio del metodo o alla fine?
  • Quale sarebbe un esempio in cui la confusione sul metodo base può metterti nei guai?
È stato utile?

Soluzione

Dovrei chiarire:

Le linee guida raccomandano che l'attivazione di un evento implichi la chiamata di un evento virtuale "OnNome dell'evento", ma dicono anche che se una classe derivata sovrascrive quel metodo e dimentica di chiamare il metodo base, l'evento dovrebbe comunque attivarsi.

Vedi la "Nota importante" a metà circa questa pagina:

Non è necessario che le classi derivate che eseguono l'override del metodo virtuale protetto chiamino l'implementazione della classe base.La classe base deve continuare a funzionare correttamente anche se la sua implementazione non viene richiamata.

Altri suggerimenti

In questo caso, se non chiami la base OnInit, anche Init non si attiverà.

In generale, è consigliabile chiamare SEMPRE il metodo di base, a meno che non si sappia specificatamente che non si desidera che si verifichi il comportamento di base.

Che venga chiamato all'inizio o alla fine dipende da come vuoi che funzionino le cose.In un caso come questo, in cui si utilizza un override invece di collegare un gestore di eventi, chiamarlo all'inizio del metodo ha più senso.In questo modo, il tuo codice verrà eseguito dopo qualsiasi gestore, il che lo rende più emulare un gestore di eventi "normale".

Sebbene le linee guida ufficiali per la progettazione del framework raccomandino diversamente, la maggior parte dei progettisti di classi in realtà renderà il metodo OnXxx() responsabile dell'attivazione dell'evento reale, in questo modo:

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

...quindi se erediti dalla classe e non chiami base.OnClick(e), l'evento Click non verrà mai attivato.

Quindi sì, anche se questo non dovrebbe essere il caso secondo le linee guida di progettazione ufficiali, penso che valga la pena chiamare base.OnInit(e) solo per essere sicuro.

le linee guida ufficiali per la progettazione della struttura raccomandano diversamente

Loro fanno?Sono curioso, ho sempre pensato il contrario, e leggere le Linee guida per la progettazione del framework e eseguire FxCop non ha fatto altro che consolidare la mia visione.Avevo l'impressione che gli eventi dovessero essere sempre attivati ​​dai metodi virtuali OnXxx(), che accettano un parametro EventArgs

Probabilmente faresti meglio a farlo in questo modo, poi questo dibattito finirà.L'articolo è tuttavia interessante, soprattutto considerando che .NET Framework non rispetta questa linea guida.

@Ch00k e @Scott Non lo so, mi piace OnNome dell'evento modellare me stesso.E sì, sono una delle persone colpevoli di aver licenziato l'evento con quel metodo.

Penso che sovrascrivere il metodo On* e chiamare quello di base sia la strada da percorrere.Gestire i propri eventi sembra in qualche modo sbagliato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top