Quelles sont les méthodes d'extension dans .NET?
EDIT: J'ai posté une question de suivi à l' utilisation des 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
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:
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 classeExtended
. Pour obtenir la moyenne, ce que vous appelezaverage
méthode, car elle appartient à l'extended
classe:Extended ex = new Extended(); Console.WriteLine(ex.average());
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.
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.
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
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 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.