Ho un background C ++ e capisco perfettamente e sono d'accordo con le risposte a questa domanda: Perché "usare lo spazio dei nomi std;" considerata cattiva pratica?
Quindi sono stupito che, avendo una certa esperienza con C # ora, vedo esattamente l'opposto lì:
using Some.Namespace;
viene letteralmente usato ovunque. Ogni volta che inizi a utilizzare un tipo, aggiungi prima una direttiva using per il suo spazio dei nomi (se non è già presente). Non ricordo di aver visto un .cs
file che non era iniziato using System; using System.Collections.Generic; using X.Y.Z; etc...
. In effetti, se aggiungi un nuovo file tramite la procedura guidata di Visual Studio, ne aggiunge automaticamente alcune usando le direttive lì, anche se potresti non averne affatto bisogno. Quindi, mentre nella comunità C ++ vieni sostanzialmente linciato, C # incoraggia persino a farlo. Almeno è così che mi appare.
Ora capisco che usare le direttive in C # e C ++ non è esattamente la stessa cosa. Inoltre, capisco che una delle cose più cattive che puoi fare using namespace
in C ++, vale a dire metterlo in un file di intestazione, non ha una controparte equivalentemente cattiva in C # a causa della mancanza di un concetto di file di intestazione e #include
.
Tuttavia, nonostante le loro differenze, l'uso delle direttive in C # e C ++ ha lo stesso scopo, che deve solo digitare SomeType
tutto il tempo, piuttosto che molto più Some.Namespace.SomeType
a lungo (in C ++ con ::
invece di .
). E con questo stesso scopo, anche il pericolo sembra essere lo stesso per me: nominare le collisioni.
Nel migliore dei casi questo si traduce in un errore di compilazione, quindi "solo" devi risolverlo. Nel peggiore dei casi, si compila ancora e il codice fa silenziosamente cose diverse da quelle che tu intendevi fare. Quindi la mia domanda è: perché (apparentemente) stanno usando le direttive considerate in modo così diseguale in C # e C ++?
Alcune idee di una risposta che ho (nessuna di queste mi soddisfa davvero):
Gli spazi dei nomi tendono ad essere molto più lunghi e molto più nidificati in C # che in C ++ (
std
vs.System.Collection.Generic
). Quindi, c'è più desiderio e più guadagno nel de-rumorizzare il codice in questo modo. Ma anche se questo è vero, questo argomento si applica solo quando guardiamo gli spazi dei nomi standard. Quelli personalizzati possono avere qualsiasi nome breve che ti piace, sia in C # che in C ++.Gli spazi dei nomi sembrano essere molto più "fini" in C # che in C ++. A titolo di esempio, in C ++ l'intera libreria standard è contenuta in
std
(oltre ad alcuni piccoli spazi dei nomi nidificati piacechrono
), mentre in C # si disponeSystem.IO
,System.Threading
,System.Text
ecc Quindi, il rischio di avere conflitti di denominazione è più piccolo. Tuttavia, questa è solo una sensazione viscerale. In realtà non ho contato quanti nomi "importate" conusing namespace std
eusing System
. E ancora, anche se questo è vero, questo argomento si applica solo quando si osservano gli spazi dei nomi standard. I tuoi possono essere progettati come granulare come desideri, sia in C # che in C ++.
Ci sono più argomenti? Sono particolarmente interessato ai fatti concreti reali (se ce ne sono) e non tanto alle opinioni.
Ext(this T t, long l)
che viene chiamato via t.Ext(0)
. Se quindi aggiungi un altro spazio dei nomi che contiene un metodo di estensione Ext(this T t, int i)
, verrà invece chiamato quello. Ma non sono un esperto di C # (ancora).