56 votes

Quelles sont les méthodes d'extension?

Quelles sont les méthodes d'extension dans .NET?



EDIT: J'ai posté une question de suivi à l' utilisation des méthodes d'extension

68voto

Andreas Grech Points 39188

Les méthodes d'Extension de permettre aux développeurs d'ajouter de nouvelles méthodes pour le public contrat d'un type CLR, sans avoir à sous-classe ou recompiler le type d'origine.

Les Méthodes d'Extension aider à mélanger les la flexibilité de la "duck typing" soutien populaire dans les langages dynamiques d'aujourd'hui avec la performance et le temps de compilation la validation de fortement typées les langues.

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

Voici un exemple d'une Méthode d'Extension (avis de l' this mot-clé devant le premier paramètre):

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

Maintenant, la méthode ci-dessus peuvent être appelées directement à partir de n'importe quelle chaîne, comme tel:

bool isValid = "so@mmas.com".IsValidEmailAddress();

L'ajout des méthodes apparaissent ensuite également dans IntelliSense:

alt text

En ce qui concerne une mise en pratique des Méthodes d'Extension, vous pouvez ajouter de nouvelles méthodes à une classe sans dériver une nouvelle classe.

Jetez un oeil à l'exemple suivant:

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;
    }
}

Comme vous le voyez, la classe Extending est l'ajout d'une méthode appelée la moyenne de la classe Extended. Pour obtenir la moyenne, ce que vous appelez average méthode, car elle appartient à l' extended classe:

Extended ex = new Extended();

Console.WriteLine(ex.average());

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

5voto

Tom Anderson Points 7228

Les méthodes d'Extension sont des moyens pour les développeurs à ajouter pour les méthodes des objets qu'ils ne peuvent pas contrôler.

Par exemple, si vous voulez ajouter un "DoSomething()" méthode pour le Système.De Windows.Les formes de l'objet, puisque vous n'avez pas accès à ce code, il vous suffit de créer une méthode d'extension pour la forme avec la syntaxe suivante.

Public Module MyExtensions

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

End Module

Maintenant, dans un formulaire, vous pouvez appeler le "Moi.DoSomething()".

En résumé, c'est un moyen d'ajouter des fonctionnalités à des objets existants, sans héritage.

5voto

Mike Hofer Points 6559

Une méthode d'extension est un "compilateur truc" qui permet de simuler l'ajout de méthodes d'une autre classe, même si vous n'avez pas le code source.

Par exemple:

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;
    } 
}

En théorie, toutes les classes de collection maintenant inclure un IsEmpty méthode qui retourne true si la méthode n'a pas les éléments (à condition que vous avez compris l'espace de noms qui définit la classe ci-dessus).

Si j'ai oublié quelque chose d'important, je suis sûr que quelqu'un va remarquer. (S'il vous plaît!)

Naturellement, il ya des règles sur la déclaration des méthodes d'extension (ils doivent être statique, le premier paramètre doit être précédée par l' this mot-clé, et ainsi de suite).

Les méthodes d'Extension ne sont pas réellement modifier les classes, ils semblent être l'extension; au lieu de cela, le compilateur mangles l'appel à la fonction correctement invoquer la méthode au moment de l'exécution. Cependant, les méthodes d'extension correctement affichés dans intellisense des listes déroulantes avec une icône spécifique, et vous pouvez le document comme vous le feriez avec une méthode normale (comme illustré ci-dessus).

Remarque: Une méthode d'extension jamais remplace une méthode si une méthode existe déjà avec la même signature.

1voto

Sisiutl Points 1673

Voici l'exemple dans VB.Net; notez l'attribut Extension (). Placez-le dans un module de votre projet.

 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})(\]?)$")
End Function
 

0voto

Don Rolling Points 529

Cette question a déjà été posée, mais je tiens à ajouter que c'est très utile si vous avez des types qui sont dans un autre projet et que vous ne voulez pas revenir à ce projet afin d'ajouter certaines fonctionnalités. Nous sommes à l'aide de NHibernate et avez un projet pour nos données de la couche de persistance que les gars veulent les garder propres. Pour obtenir de nice et détectable par d'autres méthodes sur celles de l'objet, j'ai été en mesure d'utiliser des méthodes d'extension et c'est vraiment égayé ma journée.

Aussi, puisque personne n'a posté, voici un bon article sur le sujet sur MSDN http://msdn.microsoft.com/en-us/library/bb383977.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X