I metodi di estensione esistono da C# 3, ma permettevano di aggiungere solo metodi. C# 14 introduce i blocchi extension, che consentono di definire anche proprietà di estensione e membri statici di estensione su un tipo esistente.
La nuova sintassi
All'interno di una classe statica si dichiara un blocco extension con il "ricevitore", cioè il tipo esteso. Tutti i membri del blocco possono usare quel ricevitore.
public static class StringExtensions
{
extension(string text)
{
// proprietà di estensione
public bool IsBlank => string.IsNullOrWhiteSpace(text);
// metodo di estensione, come prima ma senza "this"
public string Truncate(int max) =>
text.Length <= max ? text : text[..max] + "...";
}
}
var title = "Introduzione a .NET 10";
Console.WriteLine(title.IsBlank); // False
Console.WriteLine(title.Truncate(12)); // Introduzione...
Membri statici di estensione
Omettendo il nome del parametro si estende il tipo stesso, non un'istanza: è possibile aggiungere metodi o proprietà "statiche" a un tipo che non controlli.
public static class GuidExtensions
{
extension(Guid)
{
public static Guid FromText(string value) =>
Guid.TryParse(value, out var g) ? g : Guid.Empty;
}
}
var id = Guid.FromText("non-valido"); // Guid.Empty
Compatibilità
I vecchi metodi di estensione con this continuano a funzionare e possono convivere con i nuovi blocchi. Non serve riscrivere nulla: si adottano i blocchi extension quando servono proprietà o membri statici, o quando si vogliono raggruppare più estensioni dello stesso tipo.
Consigli
- Usa le proprietà di estensione per informazioni derivate e senza effetti collaterali.
- Evita di "riempire" tipi di sistema con decine di estensioni: preferisci namespace dedicati.
- Ricorda che un membro dell'istanza ha sempre la precedenza su un'estensione con lo stesso nome.
Commenti (0)
Nessun commento ancora.