J'ai une formation en C ++ et je comprends parfaitement et suis d'accord avec les réponses à cette question: pourquoi «utiliser namespace std;» considéré comme une mauvaise pratique?
Je suis donc étonné que, ayant une certaine expérience avec C # maintenant, je vois exactement le contraire: il
using Some.Namespace;
est littéralement utilisé partout. Chaque fois que vous commencez à utiliser un type, vous ajoutez d'abord une directive using pour son espace de noms (si ce n'est déjà fait). Je ne me souviens pas avoir vu un .cs
fichier qui n'a pas commencé using System; using System.Collections.Generic; using X.Y.Z; etc...
. En fait, si vous ajoutez un nouveau fichier via l'assistant Visual Studio, il y ajoute automatiquement des directives d'utilisation, même si vous n'en avez pas du tout besoin. Ainsi, alors que dans la communauté C ++, vous êtes essentiellement lynché, C # encourage même à le faire. C'est du moins ainsi que cela m'apparaît.
Maintenant, je comprends que l'utilisation de directives en C # et C ++ n'est pas exactement la même chose. En outre, je comprends que l'une des choses les plus méchantes que vous puissiez faire using namespace
en C ++, à savoir le placer dans un fichier d'en-tête, n'a pas d'équivalent équivalent en C # en raison de l'absence d'un concept de fichiers d'en-tête et #include
.
Cependant, malgré leurs différences, l'utilisation des directives en C # et C ++ sert le même but, qui n'a qu'à taper SomeType
tout le temps, plutôt que beaucoup plus longtemps Some.Namespace.SomeType
(en C ++ avec ::
au lieu de .
). Et dans ce même but, le danger me semble également le même: nommer les collisions.
Dans le meilleur des cas, cela entraîne une erreur de compilation, vous n'avez donc "qu'à" le corriger. Dans le pire des cas, il compile toujours et le code fait silencieusement des choses différentes de ce que vous aviez l'intention de faire. Ma question est donc la suivante: pourquoi (apparemment) utilise-t-on des directives considérées comme si inégalement mauvaises en C # et C ++?
Quelques idées de réponse que j'ai (aucune de ces réponses ne me satisfait vraiment, cependant):
Les espaces de noms ont tendance à être beaucoup plus longs et beaucoup plus imbriqués en C # qu'en C ++ (
std
vs.System.Collection.Generic
). Ainsi, il y a plus de désir et plus de gain à débruiter le code de cette façon. Mais même si cela est vrai, cet argument ne s'applique que lorsque nous regardons les espaces de noms standard. Les noms personnalisés peuvent avoir n'importe quel nom court que vous aimez, à la fois en C # et C ++.Les espaces de noms semblent être beaucoup plus "fins" en C # qu'en C ++. À titre d'exemple, en C ++ toute la bibliothèque standard est contenue dans
std
(plus quelques petits espaces de noms imbriqués commechrono
) tout en C # vousSystem.IO
,System.Threading
,System.Text
etc. Ainsi, le risque d'avoir des collisions de nommage est plus petite. Cependant, ce n'est qu'un sentiment d'intestin. Je n'ai pas vraiment compté le nombre de noms que vous "importez" avecusing namespace std
etusing System
. Et encore une fois, même si cela est vrai, cet argument ne s'applique que lorsque l'on regarde les espaces de noms standard. Les vôtres peuvent être conçus aussi fins que vous le souhaitez, en C # et en C ++.
Y a-t-il d'autres arguments? Je m'intéresse particulièrement aux faits réels (s'il y en a) et pas tellement aux opinions.
Ext(this T t, long l)
qui est appelée via t.Ext(0)
. Si vous ajoutez ensuite un autre espace de noms contenant une méthode d'extension Ext(this T t, int i)
, celui-ci sera appelé à la place. Mais je ne suis pas (encore) un expert en C #.