Partilhar via


Design de Eventos

Nota

Este conteúdo é reimpresso com permissão da Pearson Education, Inc., a partir de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition. Essa edição foi publicada em 2008 e, desde então, o livro foi totalmente revisto na terceira edição. Algumas das informações nesta página podem estar desatualizadas.

Os eventos são a forma mais comumente usada de retornos de chamada (construções que permitem que a estrutura chame o código do usuário). Outros mecanismos de retorno de chamada incluem membros que recebem delegados, membros virtuais e plug-ins baseados em interface. Dados de estudos de usabilidade indicam que a maioria dos desenvolvedores está mais confortável usando eventos do que usando os outros mecanismos de retorno de chamada. Os eventos são bem integrados com o Visual Studio e muitas linguagens.

É importante notar que existem dois grupos de eventos: eventos gerados antes de um estado do sistema mudar, chamados pré-eventos, e eventos gerados após uma mudança de estado, chamados pós-eventos. Um exemplo de pré-evento seria Form.Closing, que é levantado antes de um formulário ser fechado. Um exemplo de um pós-evento seria Form.Closed, que é levantado após o fechamento de um formulário.

✔️ USE o termo "aumentar" para eventos em vez de "fogo" ou "gatilho".

✔️ USE System.EventHandler<TEventArgs> em vez de criar manualmente novos delegados para serem usados como manipuladores de eventos.

✔️ CONSIDERE usar uma subclasse de como o argumento do evento, a menos que você tenha certeza absoluta de que o evento nunca precisará transportar dados para o método de manipulação de EventArgs eventos, caso em que você pode usar o EventArgs tipo diretamente.

Se você enviar uma API usando EventArgs diretamente, nunca poderá adicionar nenhum dado a ser transportado com o evento sem quebrar a compatibilidade. Se você usar uma subclasse, mesmo que inicialmente completamente vazia, poderá adicionar propriedades à subclasse quando necessário.

✔️ USE um método virtual protegido para gerar cada evento. Isso só é aplicável a eventos não estáticos em classes sem lacre, não a structs, classes seladas ou eventos estáticos.

O objetivo do método é fornecer uma maneira para uma classe derivada manipular o evento usando uma substituição. A substituição é uma maneira mais flexível, rápida e natural de lidar com eventos de classe base em classes derivadas. Por convenção, o nome do método deve começar com "On" e ser seguido com o nome do evento.

A classe derivada pode optar por não chamar a implementação base do método em sua substituição. Esteja preparado para isso não incluindo nenhum processamento no método necessário para que a classe base funcione corretamente.

✔️ DO tome um parâmetro para o método protegido que gera um evento.

O parâmetro deve ser nomeado e e digitado como a classe de argumento de evento.

❌ NÃO passe null como remetente ao gerar um evento não estático.

✔️ DO passa null como o remetente ao gerar um evento estático.

❌ NÃO passe null como o parâmetro de dados do evento ao gerar um evento.

Você deve passar EventArgs.Empty se não quiser passar nenhum dado para o método de manipulação de eventos. Os desenvolvedores esperam que esse parâmetro não seja nulo.

✔️ CONSIDERE gerar eventos que o usuário final pode cancelar. Isto aplica-se apenas a pré-eventos.

Use System.ComponentModel.CancelEventArgs ou sua subclasse como o argumento de evento para permitir que o usuário final cancele eventos.

Design do manipulador de eventos personalizado

Há casos em que EventHandler<T> não pode ser usado, como quando a estrutura precisa trabalhar com versões anteriores do CLR, que não suportavam genéricos. Nesses casos, talvez seja necessário projetar e desenvolver um delegado de manipulador de eventos personalizado.

✔️ DO use um tipo de retorno de void para manipuladores de eventos.

Um manipulador de eventos pode invocar vários métodos de manipulação de eventos, possivelmente em vários objetos. Se os métodos de manipulação de eventos tivessem permissão para retornar um valor, haveria vários valores de retorno para cada chamada de evento.

✔️ DO use object como o tipo do primeiro parâmetro do manipulador de eventos e chame-o senderde .

✔️ DO use System.EventArgs ou sua subclasse como o tipo do segundo parâmetro do manipulador de eventos e chame-o ede .

❌ NÃO tem mais de dois parâmetros em manipuladores de eventos.

© Partes 2005, 2009 Microsoft Corporation. Todos os direitos reservados.

Reimpresso com permissão da Pearson Education, Inc., de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition por Krzysztof Cwalina e Brad Abrams, publicado em 22 de outubro de 2008 por Addison-Wesley Professional como parte da Microsoft Windows Development Series.

Consulte também