Come lavorare con i metodi di estensione in C #

Il linguaggio di programmazione C # fornisce supporto per i metodi di estensione da C # 3.0. Un metodo di estensione è quello utilizzato per estendere la funzionalità dei tipi esistenti aggiungendo metodi senza la necessità di creare nuovi tipi derivati. Non è necessario creare sottoclassi di classi esistenti o ricompilare o modificare le classi esistenti per lavorare con i metodi di estensione. I metodi di estensione migliorano la leggibilità del codice e allo stesso tempo consentono di estendere le funzionalità dei tipi esistenti.

I metodi di estensione comuni in .Net includono gli operatori di query standard LINQ che aggiungono funzionalità di query aggiuntive ai System.Collections.IEnumerable and System.Collections.Generic.IEnumerabletipi. Nota che puoi sfruttare i metodi di estensione per estendere una classe o un'interfaccia ma non puoi sovrascrivere i loro metodi. L'MSDN afferma: "I metodi di estensione consentono di" aggiungere "metodi a tipi esistenti senza creare un nuovo tipo derivato, ricompilare o modificare in altro modo il tipo originale. I metodi di estensione sono un tipo speciale di metodo statico, ma vengono chiamati come se erano metodi di istanza sul tipo esteso. "

In sostanza, un metodo di estensione è un tipo speciale di metodo statico e consente di aggiungere funzionalità a un tipo esistente anche se non si ha accesso al codice sorgente del tipo. Un metodo di estensione è proprio come un altro metodo statico ma ha il riferimento "this" come primo parametro. Puoi aggiungere tutti i metodi di estensione che desideri a qualsiasi tipo. Ancora più importante, puoi anche aggiungere metodi di estensione anche a un tipo di valore.

Quando lavori con i metodi di estensione, tieni a mente questi punti:

  • Un metodo di estensione deve essere un metodo statico
  • Un metodo di estensione deve trovarsi all'interno di una classe statica: la classe può avere qualsiasi nome
  • Il parametro in un metodo di estensione dovrebbe sempre avere la parola chiave "this" che precede il tipo su cui deve essere chiamato il metodo

Notare che se si definisce un metodo di estensione su un tipo che ha la stessa firma di qualsiasi altro metodo del tipo che si sta estendendo, il metodo di estensione non verrà mai chiamato.

Metodi di estensione della programmazione in C #

In questa sezione esploreremo come programmare metodi di estensione utilizzando C #. Il listato di codice seguente illustra l'aspetto di un metodo di estensione.

public static class StringExtensions

    {

        public static bool IsNumeric(this string str)

        {

            double output;

            return double.TryParse(str, out output);

        }

    }

Nota il primo parametro del metodo di estensione. Come già discusso, qualsiasi metodo di estensione dovrebbe essere statico e dovrebbe avere la parola chiave "this" prima del parametro su cui si desidera venga chiamato il metodo. Quando si specifica la parola chiave "this" nell'elenco dei parametri come è stato mostrato nell'esempio precedente, si informa il compilatore che è stato definito un metodo di estensione per la classe string.

Ecco come puoi usare il metodo di estensione IsNumeric su un'istanza di stringa.

static void Main(string[] args)

        {

            string str = "100";

            if (str.IsNumeric())

                Console.WriteLine("The string object named str contains numeric value.");

            Console.Read();

        }

Quando si esegue il programma precedente, il messaggio ("L'oggetto stringa denominato str contiene un valore numerico" viene visualizzato nella finestra della console.

È possibile utilizzare metodi di estensione per iniettare nuove funzionalità tramite metodi in un tipo senza la necessità di modificare, derivare o ricompilare il tipo originale. Come accennato in precedenza, i metodi di estensione possono essere applicati anche ai tipi di valore. Vediamo come questo può essere ottenuto con un esempio.

La seguente classe denominata IntegerExtensions contiene un metodo di estensione denominato IsEven che restituisce true se il numero intero su cui viene chiamato è pari, false in caso contrario.

public static class IntegerExtensions

    {

        public static bool IsEven(this int i)

        {

            return ((i % 2) == 0);

        }

    }

Ed ecco come puoi usare il metodo di estensione IsEven su un numero intero.

int n = 2;

if(n.IsEven())

 Console.WriteLine("The value of the integer is even.");