Il s’agit d’une question sur les méthodes d’extension de C # et leur philosophie de conception. Je pense donc que le meilleur moyen de répondre à cette question est de citer la documentation de MSDN sur les méthodes d’extension :
Les méthodes d'extension vous permettent d '"ajouter" des méthodes à des types existants sans créer de nouveau type dérivé, recompiler ou modifier le type d'origine. Les méthodes d'extension sont un type spécial de méthode statique, mais elles sont appelées comme s'il s'agissait de méthodes d'instance sur le type étendu. Pour le code client écrit en C #, F # et Visual Basic, il n'y a pas de différence apparente entre l'appel d'une méthode d'extension et les méthodes réellement définies dans un type.
…
En général, nous vous recommandons d'implémenter les méthodes d'extension avec parcimonie et uniquement lorsque vous devez le faire. Dans la mesure du possible, le code client qui doit étendre un type existant doit le faire en créant un nouveau type dérivé du type existant. Pour plus d'informations, voir Héritage.
Lorsque vous utilisez une méthode d'extension pour étendre un type dont le code source ne peut pas être modifié, vous courez le risque qu'une modification de l'implémentation du type entraîne la rupture de votre méthode d'extension.
Si vous implémentez des méthodes d'extension pour un type donné, souvenez-vous des points suivants:
- Une méthode d'extension ne sera jamais appelée si elle a la même signature qu'une méthode définie dans le type.
- Les méthodes d'extension sont incluses dans la portée au niveau de l'espace de noms. Par exemple, si vous avez plusieurs classes statiques contenant des méthodes d’extension dans un seul espace-noms nommé
Extensions
, elles seront toutes portées à la portée de la using Extensions;
directive.
Pour résumer, les méthodes d'extension sont conçues pour ajouter des méthodes d'instance à un type particulier, même lorsque les développeurs ne peuvent pas le faire directement. Et parce que les méthodes d'instance vont remplacent toujours les méthodes d'extension si elles sont présentes (si elles sont appelées à l'aide de la syntaxe de méthode d'instance), vous ne devez le faire que si vous ne pouvez pas ajouter directement de méthode ou étendre la classe. *
En d'autres termes, une méthode d'extension doit agir comme une méthode d'instance, car elle peut être transformée en méthode d'instance par un client. Et parce qu'une méthode d'instance doit lancer si l'objet sur lequel il est appelé estnull
, la méthode d'extension devrait l'être également.
* Comme une note de côté, c'est exactement la situation que les concepteurs de LINQ face: quand C # 3.0 est sorti, il y avait déjà des millions de clients qui utilisaient System.Collections.IEnumerable
et System.Collections.Generic.IEnumerable<T>
, à la fois dans leurs collections et en foreach
boucles. Ces classes sont revenus des IEnumerator
objets qui n'avaient les deux méthodes Current
et MoveNext
, afin d' ajouter des méthodes d'instance supplémentaires nécessaires, commeCount
, Any
, etc., enfreindrait ces millions de clients. Ainsi, afin de fournir cette fonctionnalité ( en particulier car il peut être mis en œuvre en termes de Current
et MoveNext
avec une relative facilité), ils sortent comme des méthodes d'extension, qui peuvent être appliquées à tout moment existanteIEnumerable
exemple et peut également être implémenté par les classes de manière plus efficace. Si les concepteurs de C # avaient décidé de publier LINQ dès le premier jour, cela aurait été fourni comme méthode d'instance IEnumerable
et ils auraient probablement conçu un système pour fournir des implémentations d'interface par défaut de ces méthodes.