Métodos de extensãoExtension Methods

Métodos de extensão são um recurso de linguagem que permite que os métodos estáticos a ser chamado usando a sintaxe de chamada de método de instância.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Esses métodos devem ter pelo menos um parâmetro, que representa a instância que o método é no qual operar.These methods must take at least one parameter, which represents the instance the method is to operate on.

A classe que define esses métodos de extensão é conhecida como a classe "Patrocinador" e deve ser declarado como estático.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Para usar os métodos de extensão, uma deve importar o namespace de definição da classe de patrocinador.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frivolously definir métodos de extensão, especialmente em tipos que você não possui.X AVOID frivolously defining extension methods, especially on types you don’t own.

Se você é proprietário de um tipo de código-fonte, considere o uso de métodos de instância normal.If you do own source code of a type, consider using regular instance methods instead. Se você não possui, e você deseja adicionar um método, tenha muito cuidado.If you don’t own, and you want to add a method, be very careful. Utilização liberal dos métodos de extensão tem o potencial de desorganizar APIs de tipos que não foram projetados para ter esses métodos.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER usando métodos de extensão em qualquer um dos seguintes cenários:✓ CONSIDER using extension methods in any of the following scenarios:

  • Para fornecer auxiliar funcionalidade relevante para cada implementação de uma interface, disse que a funcionalidade pode ser escrita em termos de interface principal.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Isso ocorre porque as implementações concretas, caso contrário, não podem ser atribuídas às interfaces.This is because concrete implementations cannot otherwise be assigned to interfaces. Por exemplo, o LINQ to Objects operadores são implementados como métodos de extensão para todos os IEnumerable<T> tipos.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Portanto, qualquer IEnumerable<> implementação é automaticamente habilitado para LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Quando um método de instância introduziria uma dependência em algum tipo, mas tal dependência interrompe as regras de gerenciamento de dependência.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Por exemplo, uma dependência de String à System.Uri provavelmente não é desejável e, portanto String.ToUri() retornando do método de instância System.Uri seria um design incorreto de uma perspectiva de gerenciamento de dependência.For example, a dependency from String to System.Uri is probably not desirable, and so String.ToUri() instance method returning System.Uri would be the wrong design from a dependency management perspective. Um método de extensão estático Uri.ToUri(this string str) retornando System.Uri seria um design muito melhor.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID definir métodos de extensão em System.Object.X AVOID defining extension methods on System.Object.

Os usuários do VB não poderá chamar esses métodos em referências de objeto usando a sintaxe de método de extensão.VB users will not be able to call such methods on object references using the extension method syntax. VB não suporta chamar esses métodos porque, no VB, declarar uma referência de objeto força todas as invocações de método em que ele seja atrasado associado (chamado de membro real é determinado em tempo de execução), enquanto as associações para métodos de extensão são determinadas em tempo de compilação (no início associado).VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound).

Observe que a diretriz se aplica a outros idiomas em que o mesmo comportamento de associação está presente, ou onde não há suporte para métodos de extensão.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

X DO NOT colocar os métodos de extensão no mesmo namespace que o tipo estendido, a menos que ele seja para a adição de métodos para interfaces de ou para o gerenciamento de dependência.X DO NOT put extension methods in the same namespace as the extended type unless it is for adding methods to interfaces or for dependency management.

X AVOID definir dois ou mais métodos de extensão com a mesma assinatura, mesmo que eles estejam em namespaces diferentes.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER definir métodos de extensão no mesmo namespace que o tipo estendido se o tipo é uma interface e se os métodos de extensão devem ser usados na maioria dos casos.✓ CONSIDER defining extension methods in the same namespace as the extended type if the type is an interface and if the extension methods are meant to be used in most or all cases.

X DO NOT definir métodos de extensão implementando um recurso nos namespaces normalmente associados com outros recursos.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Em vez disso, defini-los no namespace associado com o recurso pertencem.Instead, define them in the namespace associated with the feature they belong to.

X AVOID genérico de nomenclatura de namespaces dedicado para métodos de extensão (por exemplo, "extensões").X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Use um nome descritivo (por exemplo, "roteamento") em vez disso.Use a descriptive name (e.g., "Routing") instead.

Portions © 2005, 2009 Microsoft Corporation. Todos os direitos reservados.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Reimpresso com permissão da Pearson Education, Inc. de as diretrizes de Design do Framework: As convenções, linguagens e padrões para bibliotecas do .NET reutilizável, 2nd Edition por Krzysztof Cwalina e Brad Abrams, publicados 22 de outubro de 2008 pela Addison-Wesley Professional, como parte da série de desenvolvimento do Microsoft Windows.Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

Consulte tambémSee also