Extension Members en C#

19 May 2025 10 min (0) Comentarios

 

Si recordais el resumen que hice sobre C# 13 allá por noviembre, mencioné una funcionalidad que no estaba lista pero estaba planeada, extenions everywhere; Y aquí tenemos una actualización sobre esa noticia. Ya que con la llegada de C# 14 tendremos lo que llamamos extension members.

 

Por ahora y hasta noviembre de 2025 junto con C# 14 (NET 10) la nueva funcionalidad esta en preview y no debe ser utilizada en producción.

 

 

1 - Métodos extensibles

 

En C#, desde hace muchos años tenemos los llamados extension methods que son métodos los cuales podemos utilizar para ampliar el funcionamiento de una clase. 

Por ejemplo, y para poner el mismo ejemplo que la propia microsoft puso en el anuncio.

 

Si tenemos una colección de enteros y queremos coger los que son mayores que X podemos hacer un código como el siguiente: 

List<int> values = new List<int> { 0,5,6,9,20,55,99 };

IEnumerable<int> result = values.WhereGreaterThan(18);

public static class Extensions
{
	public static IEnumerable<int> WhereGreaterThan(this IEnumerable<int> source, int threshold)
		=> source.Where(x => x > threshold);
}

Donde tenemos un método que extiende la funcionalidad de IEnumerable a través de la keyword this

En mi opinión personal esta funcionalidad del lenguaje es algo que me encanta y uso todo el tiempo.

 

 

2 - Extension methods everywhere | Extension members

 

Con la llegada de C# 14 el funcionamiento va a cambiar un poco, actualmente necesitas hacer lo que hemos hecho, crear una clase estática, junto a un método estático y el compilador sabe identificar el método al que estás llamado y por detrás lo que hace es cambiar esto:

IEnumerable<int> result = values.WhereGreaterThan(18);

A la llamada a la propia clase estática: 

IEnumerable<int> result = Extensions::WhereGreaterThan(values, 18);

(lo hace el compilador)

 

En C# 14 o .NET 10 vamos a disponer de una nueva keyword, la keyword extension. Con esta nueva keyword podemos cambiar el código anterior al siguiente: 

public static class Extensions
{
    extension(IEnumerable<int> source) 
    {
        public IEnumerable<int> WhereGreaterThan(int threshold)
            => source.Where(x => x > threshold);
    }
}

Y el código funciona exactamente igual que antes.

 

 

Llegados a este punto puedes pensar que cual es el motivo de añadir una nueva keyword. Y el motivo es porque ya no nos limitamos solo a tener métodos, sino que también podemos extender el funcionamiento con propiedades, en este caso y para seguir el ejemplo de la documentación, le añadimos una propiedad IsEmpty

public static class Extensions
{
	extension(IEnumerable<int> source)
	{
		public IEnumerable<int> WhereGreaterThan(int threshold)
			=> source.Where(x => x > threshold);

		public bool IsEmpty
		=> !source.Any(); 👈
	}
}

La cual se puede usar en el código:

List<int> values = new List<int> { 0,5,6,9,20,55,99 };

IEnumerable<int> result = values.WhereGreaterThan(18);

if (result.IsEmpty) 👈
{
	Console.WriteLine("There is no elements on the list");
}

 

 

2.1 - Uso de generics en extension members

 

Igual que los métodos extensibles, aquí también podemos utilizar generics lo cual significa que podemos hacer algo asi: 

extension<T>(IEnumerable<T> source)
    where T : INumber<T>
{
    public IEnumerable<T> WhereGreaterThan(T threshold)
        => source.Where(x => x > threshold);

    public bool IsEmpty
        => !source.Any();
}

Y en este caso en concreto, estas extensiones funcionan con cualquier tipo de C# que sea un número, int, long, float, etc. 

 

 

3 - Debemos de migrar los métodos extensibles en C# 14? 

 

Una de las preguntas que muchos os podéis hacer es si debemos de migrar todos nuestros métodos extensibles a la nueva forma. La respuesta es que no.

Ambas formas pueden coexistir, y no hay necesidad de cambiar.

Lo que yo personalmente haría es mantener consistencia, si estas en un proyecto que usa muchos extension methods, simplemente sigue incluyendolos de esa forma, en cambio si creas un proyecto desde cero y quieres empezar a añadir, se puede discutir si se va a utilizar la forma nueva o la antigua, lo que yo no recomiendo es mezclar ambas, básicamente para mantener el código lo más limpio posible. 

 

© copyright 2025 NetMentor | Todos los derechos reservados | RSS Feed

Buy me a coffee Invitame a un café