Un método de extensión en programación es un método agregado a una clase existente ( tipo ) en un lugar que no sea el módulo de declaración de clase. El azúcar sintáctico para un módulo de extensión se introdujo en C# 3.0 y VB.NET .
El método de extensión no debe confundirse con el concepto de extensión de método relacionado con la herencia ( eng. method extension ) que existe en los lenguajes CLOS , Smalltalk , Beta, en los que se llama al método de superclase antes, durante o después de que se active el método de clase. llamado [1] .
El siguiente ejemplo muestra un método de extensión definido para la clase System.String (con alias de cadena en C#). Tenga en cuenta que se define dentro de una clase estática no anidada y no configurable [2] :
namespace ExtensionMethods { public static class MyExtensions { // El método WordCount toma una cadena como entrada, devuelve el número de palabras, es decir el número de subcadenas separadas por un espacio, un punto o un signo de interrogación. public static int WordCount ( esta cadena str ) { return str . Dividir ( nuevo carácter [] { ' ' , '.' , '?' , '!' }, StringSplitOptions . RemoveEmptyEntries ). Longitud ; } } } /* El método de extensión WordCount aparecerá en el alcance si incluye el espacio de nombres adecuado: */ using ExtensionMethods ; /* Ahora se puede llamar: */ string s = "Hello Extension Methods" ; int yo = s . CuentaPalabras (); // i se establecerá en 3 int j = "Come un poco más de esos suaves bollos franceses y toma un poco de té". . CuentaPalabras (); // j se establecerá en 10En comparación con un método normal, un método de extensión es estático y el primer parámetro contiene después thisde la clase de destino y la variable de clase de destino, seguido de los parámetros del método [3] .
En C#, un método de extensión solo tiene acceso a los miembros públicos de una clase. Otra limitación es que si hay un método integrado y una extensión, el método integrado tiene prioridad [3] .
Los métodos de extensión se utilizan ampliamente en LINQ . Por ejemplo, la instrucción Select es un método de extensión de la interfaz IEnumerable [4] .
En Visual Basic .NET , los métodos de extensión permiten a los desarrolladores agregar nuevas funciones a los tipos de datos sin derivar tipos . Un método de extensión solo puede ser un procedimiento del formulario Subo Function, no una propiedad, campo o evento. El primer argumento del método especifica el tipo de datos de destino para la extensión. Los métodos de extensión solo se pueden definir dentro de los módulos. Como en C#, un método de instancia tiene prioridad sobre un método de extensión, incluso si este último tiene una firma más precisa [5] .
El lenguaje Ruby tiene una característica similar a C# 3.0 llamada "clase abierta" ( ing. clase abierta ) [6] .
clase TestClass def método1 fin def método2 final final prueba = Clase de Prueba . nueva prueba _ prueba del método 1 . método2 clase TestClass def método3 final final prueba _ método3Además, se puede agregar un método de extensión no a toda la clase, sino solo a una instancia específica. Además, en JRuby puedes agregar un método a una clase desde Java [6] . En Ruby, si hay un método incorporado y una extensión, el método extendido tiene prioridad.
En los lenguajes dinámicos comunes ( JavaScript , Perl , Python , Ruby ), el mecanismo del método de extensión puede implementarse desde hace mucho tiempo (con todas las precauciones) mediante " monkey patching " [7] .
Todavía no hay métodos de extensión en el estándar C++23 , pero hay un lugar para ellos: this-parameters [8] .