Métodos de extensión.Extension Methods

Métodos de extensión son una característica del lenguaje que permite a los métodos estáticos llamar mediante sintaxis de llamada de método de instancia.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Estos métodos deben tener al menos un parámetro, que representa la instancia en que es el método operar.These methods must take at least one parameter, which represents the instance the method is to operate on.

La clase que define estos métodos de extensión se conoce como la clase "patrocinador" y debe declararse como static.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Para usar los métodos de extensión, uno debe importar el espacio de nombres de definición de la clase de patrocinador.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID frívolamente definir métodos de extensión, especialmente en tipos que no posee.X AVOID frivolously defining extension methods, especially on types you don’t own.

Si dispone de código fuente de un tipo, considere la posibilidad de usar los métodos de instancia normal en su lugar.If you do own source code of a type, consider using regular instance methods instead. Si no posee y desea agregar un método, tenga mucho cuidado.If you don’t own, and you want to add a method, be very careful. El uso racional de métodos de extensión tiene el potencial de saturar la API de tipos que no se diseñaron para estos métodos.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER mediante métodos de extensión en cualquiera de los siguientes escenarios:✓ CONSIDER using extension methods in any of the following scenarios:

  • Para proporcionar la aplicación auxiliar de funcionalidad relevante para cada implementación de una interfaz, si dice funcionalidad puede escribirse en términos de la interfaz básica.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Esto es porque las implementaciones concretas en caso contrario, no se puede asignar a las interfaces.This is because concrete implementations cannot otherwise be assigned to interfaces. Por ejemplo, el LINQ to Objects operadores se implementan como métodos de extensión para todos los IEnumerable<T> tipos.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Por lo tanto, cualquier IEnumerable<> implementación es automáticamente habilitado para LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Cuando un método de instancia introduce una dependencia en algún tipo, pero esta dependencia interrumpiría las reglas de administración de dependencia.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Por ejemplo, una dependencia de String a System.Uri probablemente no es deseable de modo que String.ToUri() devolver el método de instancia System.Uri sería un diseño incorrecto desde una perspectiva de administración de dependencias.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. Un método de extensión estático Uri.ToUri(this string str) devolver System.Uri sería un mejor diseño.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID definir métodos de extensión en System.Object.X AVOID defining extension methods on System.Object.

Los usuarios VB no podrán llamar a dichos métodos en las referencias de objeto mediante la sintaxis de método de extensión.VB users will not be able to call such methods on object references using the extension method syntax. VB no admite llamar a dichos métodos porque, en VB, declarar una referencia como objeto obliga a todas las invocaciones de método en el que esté en tiempo de ejecución enlazado (miembro real denominado se determina en tiempo de ejecución), mientras que los enlaces a los métodos de extensión se determinan en tiempo de compilación (al principio enlazado).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).

Tenga en cuenta que el criterio se aplica a otros lenguajes, donde el mismo comportamiento de enlace está presente, o que no se admiten métodos de extensión.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 métodos de extensión en el mismo espacio de nombres como el tipo extendido a menos que sea para agregar métodos a interfaces o para la administración de dependencias.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 dos o más métodos de extensión con la misma firma, incluso si residen en diferentes espacios de nombres.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER definir métodos de extensión en el mismo espacio de nombres como el tipo extendido si el tipo es una interfaz y los métodos de extensión están diseñados para usarse en la mayoría de los 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 extensión que se implementa una característica de espacios de nombres que normalmente se asocian con otras características.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. En su lugar, definirlos en el espacio de nombres asociado con la característica que pertenecen.Instead, define them in the namespace associated with the feature they belong to.

X AVOID genérico de nomenclatura de espacios de nombres dedicados a los métodos de extensión (por ejemplo, "extensiones").X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Utilice un nombre descriptivo (por ejemplo, "enrutamiento") en su lugar.Use a descriptive name (e.g., "Routing") instead.

Portions © 2005, 2009 Microsoft Corporation. Reservados todos los derechos.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Reimpreso con permiso de Pearson Education, Inc. de instrucciones de diseño de Framework: Convenciones, expresiones y patrones para bibliotecas reutilizables. NET, 2ª edición Krzysztof Cwalina y Brad Abrams, publicada el 22 de octubre de 2008 por Addison-Wesley Professional como parte de la serie de desarrollo de 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.

Vea tambiénSee also