Méthodes d’extensionExtension Methods

Méthodes d’extension sont une fonctionnalité de langage qui permet des méthodes statiques pour être appelée à l’aide de la syntaxe de méthode d’appel d’instance.Extension methods are a language feature that allows static methods to be called using instance method call syntax. Ces méthodes doivent disposer d’au moins un paramètre, qui représente l’instance de que la méthode consiste à utiliser.These methods must take at least one parameter, which represents the instance the method is to operate on.

La classe qui définit des méthodes d’extension correspond à la classe « parrain », et elle doit être déclarée comme statique.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Pour utiliser les méthodes d’extension, un doit importer l’espace de noms définition de la classe de sponsor.To use extension methods, one must import the namespace defining the sponsor class.

X AVOID leurs intentions soient amicales définissant les méthodes d’extension, en particulier sur les types que vous ne possédez pas.X AVOID frivolously defining extension methods, especially on types you don’t own.

Si vous possédez le code source d’un type, envisagez d’utiliser les méthodes d’instance normale à la place.If you do own source code of a type, consider using regular instance methods instead. Si vous n’êtes pas propriétaire, et que vous souhaitez ajouter une méthode, soyez très prudent.If you don’t own, and you want to add a method, be very careful. L’utilisation répandue des méthodes d’extension a le potentiel d’encombrer les API de types qui n’ont pas été conçues pour que ces méthodes.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✓ CONSIDER à l’aide des méthodes d’extension dans un des scénarios suivants :✓ CONSIDER using extension methods in any of the following scenarios:

  • Pour fournir d’assistance fonctionnalités pertinentes pour chaque implémentation d’une interface, si vous dit de fonctionnalités peuvent être écrits en termes de l’interface principale.To provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. Il s’agit, car les implémentations concrètes sinon ne peut pas être attribuées aux interfaces.This is because concrete implementations cannot otherwise be assigned to interfaces. Par exemple, le LINQ to Objects opérateurs sont implémentées en tant que méthodes d’extension pour tous les IEnumerable<T> types.For example, the LINQ to Objects operators are implemented as extension methods for all IEnumerable<T> types. Par conséquent, les IEnumerable<> implémentation est automatiquement prenant en charge LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Quand une méthode d’instance créerait une dépendance sur un type, mais une telle dépendance ne fonctionneraient pas les règles de gestion de dépendance.When an instance method would introduce a dependency on some type, but such a dependency would break dependency management rules. Par exemple, une dépendance à partir de String à System.Uri n’est pas souhaitable et donc String.ToUri() retour de méthode d’instance System.Uri serait la conception incorrecte à partir d’un point de vue de gestion de dépendance.For example, a dependency from String to System.Uri is probably not desirable, and so String.ToUri() instance method returning System.Uri would be the wrong design from a dependency management perspective. Une méthode d’extension statique Uri.ToUri(this string str) retournant System.Uri serait une bien meilleure conception.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

X AVOID définition des méthodes d’extension sur System.Object.X AVOID defining extension methods on System.Object.

Les utilisateurs de Visual Basic ne sera pas en mesure d’appeler des méthodes sur les références d’objet à l’aide de la syntaxe de méthode d’extension.VB users will not be able to call such methods on object references using the extension method syntax. VB ne prend pas en charge l’appel de ces méthodes, car, en VB, déclaration comme objet force tous les appels de méthode dessus en retard d’une référence liée (appelé de membre réel est déterminé lors de l’exécution), tandis que les liaisons aux méthodes d’extension sont déterminés au moment de la compilation (anticipée lié).VB does not support calling such methods because, in VB, declaring a reference as Object forces all method invocations on it to be late bound (actual member called is determined at runtime), while bindings to extension methods are determined at compile-time (early bound).

Notez que la règle s’applique à d’autres langages où se trouve le même comportement de liaison, ou dans lequel les méthodes d’extension ne sont pas pris en charge.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

X DO NOT méthodes d’extension dans le même espace de noms en tant que le type étendu est utilisée pour ajouter des méthodes aux interfaces ou pour la gestion des dépendances.X DO NOT put extension methods in the same namespace as the extended type unless it is for adding methods to interfaces or for dependency management.

X AVOID définissant deux ou plusieurs méthodes d’extension avec la même signature, même s’ils résident dans différents espaces de noms.X AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✓ CONSIDER définition des méthodes d’extension dans le même espace de noms en tant que le type étendu si le type est une interface et si les méthodes d’extension sont destinés à être utilisés dans la plupart des cas.✓ CONSIDER defining extension methods in the same namespace as the extended type if the type is an interface and if the extension methods are meant to be used in most or all cases.

X DO NOT définir des méthodes d’extension mise en œuvre d’une fonctionnalité dans les espaces de noms normalement avec d’autres fonctionnalités.X DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Au lieu de cela, les définir dans l’espace de noms associé à la fonctionnalité qu'auquel ils appartiennent.Instead, define them in the namespace associated with the feature they belong to.

X AVOID générique d’affectation de noms d’espaces de noms dédié aux méthodes d’extension (par exemple, « Extensions »).X AVOID generic naming of namespaces dedicated to extension methods (e.g., "Extensions"). Utilisez un nom descriptif (par exemple, « routage ») à la place.Use a descriptive name (e.g., "Routing") instead.

Portions © 2005, 2009 Microsoft Corporation. Tous droits réservés.Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Réimprimé avec l’autorisation de Pearson éducation, Inc. à partir de instructions de conception Framework : Conventions, les idiomes et les modèles pour les bibliothèques .NET réutilisable, 2nd Edition Krzysztof Cwalina et Brad Abrams, publié le 22 octobre 2008 par Addison-Wesley Professional dans le cadre de la série de développement de Microsoft Windows.Reprinted by permission of Pearson Education, Inc. from Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition by Krzysztof Cwalina and Brad Abrams, published Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

Voir aussiSee also