Méthodes d’extensionExtension Methods

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

La classe qui définit ces méthodes d’extension est appelée classe « sponsor » et doit être déclarée comme static.The class that defines such extension methods is referred to as the "sponsor" class, and it must be declared as static. Pour utiliser des méthodes d’extension, vous devez importer l’espace de noms définissant la classe sponsor.To use extension methods, one must import the namespace defining the sponsor class.

❌ Évitez les frivolously définissant les méthodes d’extension, en particulier sur les types dont vous n’êtes pas propriétaire.❌ AVOID frivolously defining extension methods, especially on types you don't own.

Si vous disposez d’un code source de type, envisagez plutôt d’utiliser des méthodes d’instance normales.If you do own source code of a type, consider using regular instance methods instead. Si vous ne possédez pas et que vous souhaitez ajouter une méthode, soyez très vigilant.If you don't own, and you want to add a method, be very careful. La libéralisation de l’utilisation des méthodes d’extension risque d’encombrer les API de types qui n’ont pas été conçues pour avoir ces méthodes.Liberal use of extension methods has the potential of cluttering APIs of types that were not designed to have these methods.

✔️ envisagez d’utiliser des méthodes d’extension dans l’un des scénarios suivants :✔️ CONSIDER using extension methods in any of the following scenarios:

  • Pour fournir des fonctionnalités d’assistance relatives à chaque implémentation d’une interface, si cette fonctionnalité peut être écrite en termes d’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. Cela est dû au fait que les implémentations concrètes ne peuvent pas être assignées à des interfaces.This is because concrete implementations cannot otherwise be assigned to interfaces. Par exemple, les LINQ to Objects opérateurs sont implémentés 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. Ainsi, toutes les IEnumerable<> implémentations sont automatiquement compatibles LINQ.Thus, any IEnumerable<> implementation is automatically LINQ-enabled.

  • Quand une méthode d’instance introduit une dépendance sur un certain type, mais une telle dépendance rompt les règles de gestion des dépendances.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 de String à System.Uri n’est probablement pas souhaitable. par conséquent, String.ToUri() la méthode d’instance qui retourne System.Uri serait la mauvaise conception du point de vue de la gestion des dépendances.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. Le retour d’une méthode d’extension statique Uri.ToUri(this string str) System.Uri est une bien meilleure conception.A static extension method Uri.ToUri(this string str) returning System.Uri would be a much better design.

❌ Évitez de définir des méthodes d’extension sur System.Object .❌ AVOID defining extension methods on System.Object.

Les utilisateurs VB ne peuvent pas appeler ces méthodes sur des 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 telles méthodes, car, en VB, la déclaration d’une référence en tant qu’objet force la liaison tardive de tous les appels de méthode sur celui-ci (le membre réel appelé est déterminé au moment de l’exécution), tandis que les liaisons aux méthodes d’extension sont déterminées au moment de la compilation (liaison anticipée).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 l’instruction s’applique à d’autres langages où le même comportement de liaison est présent, ou où les méthodes d’extension ne sont pas prises en charge.Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported.

❌ NE placez pas les méthodes d’extension dans le même espace de noms que le type étendu, sauf s’il s’agit d’ajouter des méthodes aux interfaces ou pour la gestion des dépendances.❌ 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.

❌ Évitez de définir deux ou plusieurs méthodes d’extension avec la même signature, même si elles se trouvent dans des espaces de noms différents.❌ AVOID defining two or more extension methods with the same signature, even if they reside in different namespaces.

✔️ ENVISAGER de définir des méthodes d’extension dans le même espace de noms que le type étendu si le type est une interface et si les méthodes d’extension sont destinées à être utilisées dans la plupart ou dans tous les 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.

❌ NE définissez pas de méthodes d’extension implémentant une fonctionnalité dans les espaces de noms généralement associés à d’autres fonctionnalités.❌ DO NOT define extension methods implementing a feature in namespaces normally associated with other features. Au lieu de cela, définissez-les dans l’espace de noms associé à la fonctionnalité à laquelle ils appartiennent.Instead, define them in the namespace associated with the feature they belong to.

❌ Évitez les noms génériques des espaces de noms dédiés aux méthodes d’extension (par exemple, « extensions »).❌ 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.

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

Réimprimé avec l’autorisation de Pearson Education, Inc. et extrait de Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition par Krzysztof Cwalina et Brad Abrams, publié le 22 octobre 2008 par Addison-Wesley Professional dans le cadre de la série sur le développement 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