Waarom wordt "using System;" niet beschouwd als een slechte praktijk?

Ik heb een C++ achtergrond en ik begrijp en ben het volledig eens met de antwoorden op deze vraag: Waarom wordt "using namespace std;" beschouwd als een slechte praktijk?

Ik'ben dus verbaasd dat, nu ik wat ervaring heb met C#, ik daar precies het tegenovergestelde zie: using Some.Namespace; wordt letterlijk overal gebruikt. Als je een type gaat gebruiken, voeg je eerst een using directive voor zijn namespace toe (als die er nog niet is). Ik kan me niet herinneren een .cs-bestand gezien te hebben dat niet begon met using System; using System.Collections.Generic; using X.Y.Z; etc.... In feite, als je een nieuw bestand toevoegt via de Visual Studio wizard, voegt het daar automatisch een aantal using directives aan toe, ook al heb je die misschien helemaal niet nodig. Dus, terwijl je in de C++ gemeenschap in principe wordt gelyncht, moedigt C# het zelfs aan om dit te doen. Tenminste, zo komt het op mij over.

Nu begrijp ik dat het gebruik van directives in C# en C++ niet precies hetzelfde is. Ook begrijp ik dat een van de vervelendste dingen die je kunt doen met gebruik van namespace in C++, namelijk het plaatsen in een header file, geen equivalent vervelende tegenhanger heeft in C# vanwege het ontbreken van een concept van header files en #include.

Echter, ondanks hun verschillen, dienen het gebruik van directives in C# en C++ hetzelfde doel, namelijk om de hele tijd alleen SomeType te hoeven typen, in plaats van het veel langere Some.Namespace.SomeType (in C++ met :: in plaats van .). En met ditzelfde doel, lijkt mij ook het gevaar hetzelfde: naams botsingen.

In het beste geval resulteert dit in een compilatiefout, zodat je "only" het hoeft te repareren. In het slechtste geval compileert het nog steeds en doet de code stilletjes andere dingen dan je bedoeld had. Dus mijn vraag is: **Waarom wordt het gebruik van directives in C# en C++ (blijkbaar) als zo ongelijkwaardig slecht beschouwd?

Enkele ideeën van een antwoord die ik heb (geen van deze bevredigt me echt, dat wel):

  • Namespaces zijn in C# veel langer en veel meer genest dan in C++ (std vs. System.Collection.Generic). Er is dus meer wens en meer winst in het de-noisen van de code op deze manier. Maar zelfs als dit waar is, geldt dit argument alleen als we kijken naar de standaard namespaces. Aangepaste namespaces kunnen elke korte naam hebben die je maar wilt, zowel in C# als in C++.

  • Namespaces lijken veel "fijnmaziger" te zijn in C# dan in C++. Als voorbeeld, in C++ zit de hele standaard bibliotheek in std (plus een paar kleine geneste namespaces zoals chrono) terwijl je in C# System.IO, System.Threading, System.Text enz. hebt. Dus, het risico van naams botsingen is kleiner. Echter, dit is slechts een onderbuik gevoel. Ik heb niet echt geteld hoeveel namen je "importeert" met using namespace std en using System. En nogmaals, zelfs als dit waar is, geldt dit argument alleen als je naar de standaard namespaces kijkt. Uw eigen namespaces kunt u zo fijnmazig ontwerpen als u zelf wilt, zowel in C# als in C++.

Zijn er meer argumenten? Ik'ben vooral geïnteresseerd in daadwerkelijke harde feiten (als die er zijn) en niet zozeer in meningen.

Commentaar op de vraag (31)
Oplossing

Waarom wordt "System; gebruiken" niet als een slechte gewoonte beschouwd?

"using System;" wordt niet universeel niet beschouwd als een slechte praktijk. Zie bijvoorbeeld: Waarom zou je de 'using' directive niet gebruiken in C#?

Maar het kan waar zijn dat het niet als zo slecht wordt beschouwd als gebruik van namespace std. Waarschijnlijk omdat:

    1. C# geen header bestanden heeft. Het is ongebruikelijk om een C# bronbestand te includen in een ander bestand met behulp van een pre-processor.
    1. De std namespace is bijna plat, d.w.z. dat bijna alle standaard bibliotheek functies, types en variabelen erin zitten (er zijn een paar uitzonderingen zoals de filesystem sub-namespace). Het bevat een zeer, zeer hoog aantal identifiers. Als ik het goed begrijp, bevat System veel minder namen, en heeft het in plaats daarvan meer sub-namespaces.
  1. In C# zijn er geen globale functies of variabelen. Als zodanig is het aantal globale identifiers typisch vrij klein in tegenstelling tot C++, dat die wel heeft: Verder is het typisch om C bibliotheken te gebruiken (vaak indirect) die geen namespaces hebben, en daarom al hun namen in de globale namespace plaatsen.

  2. Voor zover ik weet heeft C# geen argument dependent lookup. ADL in combinatie met name hiding, overloading enz. kan gevallen opleveren waarin sommige programma's geen last hebben van een naamconflict, terwijl andere er wel subtiel last van hebben, en het is niet haalbaar om alle hoekgevallen te vangen met testen.

Vanwege deze verschillen, heeft "using System;" minder kans op een naamconflict dan using namespace std.


Ook is namespace "importeren" in zekere zin een conventie die zichzelf in stand houdt: Als het conventioneel is om een standaard namespace te importeren, dan zullen programmeurs conventioneel proberen om geen namen uit die namespace te kiezen voor hun eigen identifiers, wat helpt om problemen met zo'n conventie te verminderen.

Als zo'n import als een slechte praktijk wordt beschouwd, dan zullen programmeurs minder geneigd zijn om zelfs maar te proberen conflicten met geïmporteerde namespaces te vermijden. Als zodanig hebben conventies de neiging om gepolariseerd te raken voor of tegen de praktijk, zelfs als het gewicht van de argumenten tussen de keuzes oorspronkelijk subtiel was.

Commentaren (6)

Ondanks hun verschillen dienen het gebruik van directives in C# en C++ echter hetzelfde doel, namelijk dat je de hele tijd alleen maar SomeType hoeft te typen, in plaats van het veel langere Some.Namespace.SomeType (in C++ met :: in plaats van .). En met datzelfde doel lijkt mij ook het gevaar: naambotsingen.

Ja, maar dat gevaar exporteer je niet (lees: dwing je anderen ermee om te gaan), want:

Nu begrijp ik wel dat het gebruik van directives in C# en C++ niet precies hetzelfde is. Ook begrijp ik dat een van de vervelendste dingen die je kunt doen met het gebruik van namespace in C++, namelijk het plaatsen in een header file, geen equivalent heeft in C# door het ontbreken van een concept van header files en #include.

Het is dus eerder een andere categorie van dingen.

C++ is ook niet "designed" om in een IDE te worden ontwikkeld, zoals C# dat is. C# wordt in principe altijd geschreven in Visual Studio met zijn Intellisense en wat al niet meer. Het is ontworpen om op die manier gebruikt te worden, door de mensen die het gemaakt hebben. Ongeacht hoeveel mensen een IDE gebruiken om in C++ te ontwikkelen, het is niet ontworpen met dat gebruik als een overweldigend punt van zorg.

Namespaces lijken veel meer "fine granular" te zijn in C# dan in C++.

Ja, dat ook. Gebruik maken van namespace std en Gebruik maken van System.Collection.Generic zijn niet te vergelijken.

Dus'vergelijk ze niet!

Commentaren (5)