Je ne suis pas d'accord avec tout le monde.
Je pense que dans un sous-ensemble limité de cas (la plupart du temps avec des méthodes d'extension), il est parfaitement raisonnable de placer du code dans un espace de noms système.
Voici mon côté de l'argument d'un fil de discussion que nous avions débattre des méthodes d'extension dans l'espace de noms System sur au EPS:
Ok, voici donc mon côté de l'argument:
J'aime vraiment minimiser le code. Cela inclut les utilisations. Oui, ReSharper reprend les méthodes d'extension et ajoute les utilisations pour vous mais certaines personnes n'ont pas de ReSharper, et d'ailleurs, je préfère Coderush qui n'a pas encore (pour autant que je sache) d'extension espaces de noms.
Il existe au moins deux types différents de méthodes d'extension; ceux qui sont des méthodes auxiliaires pour notre application - y compris les aides spécifiques au domaine et à l'application, et ceux qui encapsulent les caractéristiques et la syntaxe que nous pensons que le langage devrait avoir à commencer.
Un bon exemple de ce dernier est la possibilité de faire "a {0} {1}".Format("b", "c")
ou someListOfStrings.Join(", ")
plutôt que d'avoir à faire String.Join(someStringList.ToArray(), ", ")
. D'autres exemples plus discutables sont IEnumerable<T>.ForEach
et l'extension IsNull()
pour prendre la place de la syntaxe maladroite object.ReferenceEquals(null, someVar)
. Mon argument est, qu'il y a toutes les raisons de placer cette dernière classification - votre équipe est généralement d'accord qu'elle devrait être dans la langue mais ne l'est pas - dans l'espace de nom approprié (System, System.IO, System.Linq, etc.).Nous voulons que ces fonctions soient disponibles partout, tout comme nous préférons que les mots-clés foreach et yield soient toujours visibles. Si elle est spécifique à l'application, elle doit toutefois figurer dans son propre espace de nom. 90% du temps, les extensions auxiliaires spécifiques à l'application ne devraient probablement pas être des extensions et ne sont même pas statiques. J'exclus de cette instruction en utilisant des méthodes d'extension pour fournir des alias pour les noms de fonctions.
Vous pouvez rencontrer des problèmes lors de l'appel à des assemblys contenant des extensions à l'échelle du système. Supposons que je référençais l'assembly contenant ma méthode vide IEnumerable<T>.ForEach
et que je voulais créer mon propre R IEnumerable<T, R>.ForEach
(qui est en fait juste un Select, mais qui ne va pas). Ce serait un problème! Ce que j'aime faire pour atténuer le problème est de définir mes classes d'extension comme étant internes afin qu'elles puissent être utilisées uniquement sur mon projet. Cela résout bien le problème.
Je voulais créer un espace de noms enfant de 'System.InteropServices' pour éviter cela, mais je vois que ce n'est probablement pas une bonne idée. –