Domanda

Quali sono i metodi di estensione in .NET?


EDIT: Ho pubblicato una domanda di follow-up su Utilizzo dei metodi di estensione

È stato utile?

Soluzione

  

Metodi di estensione consentono agli sviluppatori di aggiungere nuovi metodi al pubblico   contratto di un tipo CLR esistente,   senza dover sottoclassarlo o   ricompilare il tipo originale.

     

I metodi di estensione aiutano a fondere il   flessibilità di "quotazione anatra" supporto   popolare nelle lingue dinamiche oggi   con le prestazioni e il tempo di compilazione   validazione di caratteri fortemente tipizzati   lingue.

Riferimento: http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx

Ecco un esempio di un metodo di estensione (notare la parola chiave this davanti al primo parametro):

public static bool IsValidEmailAddress(this string s)
{
    Regex regex = new Regex(@"^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}
bool isValid = "so@mmas.com".IsValidEmailAddress();
quot;); return regex.IsMatch(s); }

Ora, il metodo sopra può essere chiamato direttamente da qualsiasi stringa, come ad esempio:

public class Extended {
    public int Sum() {
        return 7+3+2;
    }
}

public static class Extending {
    public static float Average(this Extended extnd) {
        return extnd.Sum() / 3;
    }
}

I metodi aggiunti verranno quindi visualizzati anche in IntelliSense:

 alt text
(fonte: scottgu.com )

Per quanto riguarda un uso pratico dei metodi di estensione, è possibile aggiungere nuovi metodi a una classe senza derivarne una nuova.

Dai un'occhiata al seguente esempio:

Extended ex = new Extended();

Console.WriteLine(ex.average());

Come vedi, la classe Extending sta aggiungendo un metodo chiamato media alla classe Extended . Per ottenere la media, si chiama il metodo media , poiché appartiene alla classe extended :

<*>

Riferimento: http://aspguy.wordpress.com/2008/07/03/a-practical-use-of-serialization-and-extension-methods-in-c-30/

Altri suggerimenti

Metodi di estensione - Spiegazione semplice

Supponiamo che io abbia un cane. Tutti i cani & # 8211; tutti gli animali di tipo cane - fai certe cose:

  1. Mangia
  2. WagsTail
  3. Grida & # 8220; Woof! & # 8221;
  4. Shakes Paw etc

Le cose che un cane può fare sono tutte chiamate metodi & # 8220; & # 8221 ;.

Ora supponiamo che il Grande Programmatore in OO Heaven abbia dimenticato di aggiungere un metodo alla classe del cane: FetchNewspaper (). Vuoi essere in grado di dire:

rex.FetchNewspaper(); // or
wolfie.FetchNewspaper(); // or
beethoven.FetchNewspaper(); 

...... anche se non hai accesso al codice sorgente.

Come stai andando per convincere il tuo cane a farlo? La tua unica soluzione è creare un metodo di estensione & # 8220; & # 8221 ;.

Creazione di un metodo di estensione

(Nota la parola chiave & # 8220; questa & # 8221; davanti al primo parametro seguente):

public static void FetchNewsPaper(this Dog familyDog)
{
     Console.Writeline(“Goes to get newspaper!”)
}

E se vuoi che il tuo cane ottenga il giornale, fallo semplicemente:

Dog freddie_the_family_dog = new Dog();

freddie_the_family_dog.FetchNewspaper();

Puoi aggiungere un metodo su una classe senza avere il codice sorgente . Questo può essere estremamente utile!

I metodi di estensione sono modi per gli sviluppatori di " aggiungere su " metodi per oggetti che non possono controllare.

Ad esempio, se desideri aggiungere un " DoSomething () " metodo all'oggetto System.Windows.Forms, poiché non si ha accesso a quel codice, è sufficiente creare un metodo di estensione per il modulo con la seguente sintassi.

Public Module MyExtensions

    <System.Runtime.CompilerServices.Extension()> _
    Public Sub DoSomething(ByVal source As System.Windows.Forms.Form)
        'Do Something
    End Sub

End Module

Ora all'interno di un modulo puoi chiamare " Me.DoSomething () " ;.

In breve, è un modo per aggiungere funzionalità agli oggetti esistenti senza ereditarietà.

Un metodo di estensione è un "trucco del compilatore" che ti consente di simulare l'aggiunta di metodi a un'altra classe, anche se non hai il codice sorgente per esso.

Ad esempio:

using System.Collections;
public static class TypeExtensions
{
    /// <summary>
    /// Gets a value that indicates whether or not the collection is empty.
    /// </summary>
    public static bool IsEmpty(this CollectionBase item)
    {
        return item.Count == 0;
    } 
}

In teoria, tutte le classi di raccolta ora includono un metodo IsEmpty che restituisce true se il metodo non ha elementi (a condizione che tu abbia incluso lo spazio dei nomi che definisce la classe sopra).

Se ho perso qualcosa di importante, sono sicuro che qualcuno lo segnalerà. (Per favore!)

Naturalmente ci sono delle regole sulla dichiarazione dei metodi di estensione (devono essere statici, il primo parametro deve essere preceduto dalla parola chiave this e così via).

I metodi di estensione in realtà non modificano le classi che sembrano estendere; invece, il compilatore modifica la chiamata della funzione per invocare correttamente il metodo in fase di esecuzione. Tuttavia, i metodi di estensione appaiono correttamente nei menu a discesa intellisense con un'icona distintiva e puoi documentarli proprio come faresti con un metodo normale (come mostrato sopra).

Nota: un metodo di estensione mai sostituisce un metodo se esiste già un metodo con la stessa firma.

Ecco l'esempio in VB.Net; notare l'attributo Extension (). Inseriscilo in un modulo nel tuo progetto.

Imports System.Runtime.CompilerServices
<Extension()> _
Public Function IsValidEmailAddress(ByVal s As String) As Boolean
    If String.IsNullOrEmpty(s) Then Return False

    Return Regex.IsMatch(email, _
         "^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)<*>quot;)
End Function

Questa domanda ha già ricevuto una risposta, ma vorrei aggiungere che è molto utile se hai tipi che si trovano all'interno di un altro progetto e non vuoi tornare a quel progetto per aggiungere un po ' funzionalità. Stiamo usando NHibernate e abbiamo un progetto per il nostro livello di persistenza dei dati che i ragazzi vogliono mantenere puliti. Al fine di ottenere metodi aggiuntivi piacevoli e rilevabili su quegli oggetti, sono stato in grado di utilizzare i metodi di estensione e mi ha davvero illuminato la giornata.

Inoltre, poiché nessun altro lo ha pubblicato, ecco un buon articolo su MSDN - http://msdn.microsoft.com/en-us/library/bb383977.aspx

Ho pensato di aggiungere una spiegazione più concettuale e meno dipendente dal codice.

Immagina una Ford che rotola fuori dalla linea di costruzione. Non hai accesso alla linea di costruzione, ma vuoi che tutte le auto Ford possano avere uno spoiler aggiuntivo aggiunto sul retro dell'auto (sembra più fresco quando in mostra). Come lo farai? Nel mondo dell'informatica, a meno che tu non abbia accesso alla linea di costruzione originale all'interno di una fabbrica Ford, non puoi limitarti a bullonare cose sulla Ford. Bene, ora puoi: INVIO dei metodi di estensione.

Ora puoi fare cose del genere:

Ford hilux = new Ford();

hilux.DisplayRearFoiler(); // you can now do this even though you don't have access to the Ford source code.

Dovrai creare il metodo di estensione. Fare riferimento alle risposte sopra.

Voglio rispondere ai metodi di estensione in termini di classe sigillata .

Supponi di avere una classe sigillata che contiene metodi vitali. Ora vuoi aggiungere un nuovo metodo ad esso. Supponiamo che questa classe sia contenuta in una DLL esterna, quindi non è possibile aggiungere un nuovo metodo. Cosa farai ?

Prendi un altro esempio. Supponiamo che la classe sia creata nella tua applicazione dal tuo Project Manager o Security Guru. Puoi modificare quella classe solo prendendo l'autorizzazione del tuo Project Manager o Security Guru.

  

La tua soluzione potrebbe essere quella di rimuovere la parola chiave sigillata da questa classe e   ereditarlo in un'altra classe. Quindi all'interno della sottoclasse (che eredita questa classe) è possibile aggiungere il nuovo metodo.

Ma aspetta - > Non puoi semplicemente rimuovere la parola chiave sigillata poiché ciò può compromettere la sicurezza dell'intera applicazione. Posso scommettere che il tuo PM o Security Guru non ti darà mai quell'autorizzazione citando problemi di sicurezza.

Quindi cosa si può fare qui?

La risposta è Metodi di estensione che possono essere aggiunti in una classe statica e non è nemmeno più necessario toccare la classe sigillata.

Esempio: -

sealed class MyData
{
    private double D1, D2, D3;
    public MyData(double d1, double d2, double d3)
    { D1 = d1; D2 = d2; D3 = d3; }
    public double Sum() { return D1 + D2 + D3; }
}

static class ExtendMyData
{
    public static double Average(this MyData md)
    {
        return md.Sum() / 3;
    }
}

Ho aggiunto un metodo statico pubblico denominato Media a una nuova classe statica. Questo metodo ha il parametro della classe principale con la parola chiave "this" in primo piano.

Ora per chiamare il metodo Average uso l'oggetto della classe sigillata padre e non la sottoclasse.

 MyData md = new MyData(3, 4, 5);
 double exAverage = md.Average();

Spero che troverai utili i metodi di estensione.

Metodo di estensione in C #

Che cos'è il metodo di estensione?

Extension method means Class name and method name are having with Static Key word.

Metodo di estensione che utilizza la parola chiave "this" e dovrebbe essere la prima firma che indica l'indirizzo di identificazione, questo tipo deve essere uguale per like,

stringa statica pubblica Meth ( questa stringa i, int j)

e

string res = " ae " .Meth (num);

La parte in grassetto è l'indirizzo di identificazione. Lo spazio dei nomi dovrebbe essere lo stesso.

Perché abbiamo bisogno dell'estensione?

Stiamo usando la stessa funzione in molti posti, dopo non siamo riusciti a trovare il motivo per cui usiamo qui. Per questo motivo utilizzando l'identificazione dell'indirizzo. Statico significa singola istanza. Questo può accedere solo alla funzione membro statico. Anche come accedere senza metodi di classe statici nella classe statica? Esempio: vedi errore di lancio nel metodo "Sal",

classe statica Emp     {         public int Sal (int i, int j)         {             ritorna i * j;         }     }

Accedi solo al membro statico. E

inserisci qui la descrizione dell'immagine

Il seguente codice non è stato possibile creare l'oggetto per la classe non statica con nella classe statica. Quindi come accedere al metodo non statico nella classe statica. Per questo motivo, seguiamo il metodo Extension senza ereditarietà.

Ad esempio, aggiungere o anche la funzionalità utilizzando il metodo di estensione qui,

utilizzando il sistema. Testo;

utilizzando System.Threading.Tasks;

Spazio dei nomi Extension_Method {     Programma di classe statica     {

    public static string Meth (this string i,int j)
    {
        if (j % 2 == 0)
        {
            return "Even";
        }
        else
        {
            return "ODD";

        }
    }


}
class program2
{
    static void Main (string [] args)
    {
        Console. WriteLine ("Enter Integer");
        int num = Convert.ToInt32(Console.ReadLine());

        string res = "ae".Meth(num);

        Console. WriteLine(res);
        Console.ReadLine();
    }
}

Risultato:

inserisci qui la descrizione dell'immagine

A volte vogliamo aggiungere le nostre funzionalità aggiuntive a un tipo e usarle come normali metodi di istanza su quel tipo. Se avessimo il codice sorgente, potremmo facilmente aggiungere nuove funzionalità senza creare metodi di estensione. Ma il problema si verifica quando non abbiamo codice sorgente e amp; desidera ancora aggiungere e chiamare funzionalità aggiuntive come metodi di istanza su un tipo; i metodi di estensione servono a questo scopo di aggiungere le nostre funzionalità a un tipo & amp; usali come metodi di istanza sul tipo quando il codice sorgente non è disponibile.

Quando vogliamo aggiungere le nostre stesse funzionalità, possiamo anche creare una classe statica separata e chiamare i suoi metodi statici nel nostro codice invece di creare metodi di estensione, ma il problema può essere leggibilità del codice .

LINQ beneficia notevolmente dei metodi di estensione.

Possono essere davvero utili al momento dello sviluppo, quando i metodi richiesti sono facilmente disponibili usando Intellisense per più sviluppatori; mentre con metodi statici dovremmo scrivere className.MethodName () ogni volta nel nostro codice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top