Partilhar via


Métodos da Extensão

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 métodos de extensão são um recurso de linguagem que permite que métodos estáticos sejam chamados usando sintaxe de chamada de método de instância. Esses métodos devem ter pelo menos um parâmetro, que representa a instância em que o método deve operar.

A classe que define tais métodos de extensão é referida como a classe "patrocinador" e deve ser declarada como estática. Para usar métodos de extensão, deve-se importar o namespace que define a classe sponsor.

❌ EVITE definir de forma frívola métodos de extensão, especialmente em tipos que você não possui.

Se você possui código-fonte de um tipo, considere usar métodos de instância regulares. Se você não possui e quer adicionar um método, tenha muito cuidado. O uso liberal de métodos de extensão tem o potencial de atrapalhar APIs de tipos que não foram projetados para ter esses métodos.

✔️ CONSIDERE o uso de métodos de extensão em qualquer um dos seguintes cenários:

  • Para fornecer funcionalidade auxiliar relevante para cada implementação de uma interface, se essa funcionalidade pode ser escrita em termos da interface principal. Isso ocorre porque implementações concretas não podem ser atribuídas a interfaces. Por exemplo, os LINQ to Objects operadores são implementados como métodos de extensão para todos os IEnumerable<T> tipos. Assim, qualquer IEnumerable<> implementação é automaticamente habilitada para LINQ.

  • Quando um método de instância introduziria uma dependência em algum tipo, mas essa dependência quebraria as regras de gerenciamento de dependência. Por exemplo, uma dependência de para System.Uri provavelmente não é desejável e, portantoString.ToUri(), o retorno System.Uri do método de instância seria o design errado de uma perspetiva de gerenciamento de String dependência. Um método Uri.ToUri(this string str) de extensão estática retornando System.Uri seria um design muito melhor.

❌ EVITE definir métodos de extensão em System.Object.

Os usuários do VB não poderão chamar esses métodos em referências de objeto usando a sintaxe do método extension. VB não suporta chamar tais métodos porque, em VB, declarar uma referência como Object força todas as invocações de método nele a serem vinculadas tardiamente (o membro real chamado é determinado em tempo de execução), enquanto as ligações a métodos de extensão são determinadas em tempo de compilação (limite inicial).

Observe que a diretriz se aplica a outros idiomas onde o mesmo comportamento de associação está presente ou onde os métodos de extensão não são suportados.

❌ NÃO coloque métodos de extensão no mesmo namespace que o tipo estendido, a menos que seja para adicionar métodos a interfaces ou para gerenciamento de dependência.

❌ EVITE definir dois ou mais métodos de extensão com a mesma assinatura, mesmo que residam em namespaces diferentes.

✔️ CONSIDERE definir métodos de extensão no mesmo namespace que o tipo estendido se o tipo for uma interface e se os métodos de extensão se destinarem a ser usados na maioria ou em todos os casos.

❌ NÃO defina métodos de extensão implementando um recurso em namespaces normalmente associados a outros recursos. Em vez disso, defina-os no namespace associado ao recurso ao qual pertencem.

❌ EVITE nomenclatura genérica de namespaces dedicados a métodos de extensão (por exemplo, "Extensões"). Em vez disso, use um nome descritivo (por exemplo, "Roteamento").

© 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