La aparición de los métodos de extensión está relacionada con la necesidad de agregar nuevas funciones a tipos de datos existentes (especialmente a aquellos de bibliotecas y externos) sin modificar el código fuente de esos tipos. Esto es especialmente relevante en las aplicaciones modernas de .NET, donde se requieren comodidades adicionales pero no se tiene acceso a la modificación de las clases base.
El problema radicaba en la imposibilidad de extender tipos sin crear derivados o envoltorios, lo que conducía a una arquitectura compleja y a una herencia "falsa".
La solución son los métodos de extensión. En Visual Basic se declaran como módulos con métodos estáticos marcados con el atributo <Extension>. El primer parámetro del método siempre apunta al tipo que se va a extender, lo que permite acceder al método como a un miembro normal del objeto.
Ejemplo de código:
Imports System.Runtime.CompilerServices Module StringExtensions <Extension> Public Function ToTitleCase(ByVal str As String) As String If String.IsNullOrEmpty(str) Then Return str Return Char.ToUpper(str(0)) & str.Substring(1).ToLower() End Function End Module ' Uso: Dim s As String = "visual basic" Console.WriteLine(s.ToTitleCase()) ' Visual basic
Características clave:
¿Se puede llamar a un método de extensión a través del nombre de la clase en lugar del de la instancia?
Sí, se puede invocar un método de extensión a través del nombre de la clase de extensión como un método estático, simplemente especificando explícitamente el primer parámetro (this/Me).
Ejemplo de código:
StringExtensions.ToTitleCase("test string")
¿Se puede anular (Override) el comportamiento de los métodos del sistema mediante métodos de extensión?
No, los métodos de extensión no anulan los métodos de instancia existentes. Si hay coincidencia de nombres, se llamará al método nativo del tipo.
¿Pueden los métodos de extensión tener un número variable de argumentos (ParamArray), por ejemplo, para cadenas?
Sí, se puede usar ParamArray en métodos de extensión, al igual que en métodos estáticos normales.
En un gran proyecto, se crean métodos de extensión propios para cada tipo con nombres que se sobrelapan y con lógica diferente, sin un estilo unificado.
Ventajas:
Desventajas:
En el módulo se recogen solo extensiones universales y bien documentadas para operaciones estándar sobre tipos. El nombre de cada método indica claramente su propósito.
Ventajas:
Desventajas: