2013-07-23 11 views
12

Sono solo curioso di sapere perché la direttiva "using namespace" sia accettabile in C#, though in C++ it is not. Sono consapevole che C++ e C# sono diversi, ma la mia ipotesi è che C++ e C# arrivino quasi dalla stessa famiglia e dovrebbero usare le stesse idee per la risoluzione dello spazio dei nomi. Sia C++ che C# hanno entrambi una parola chiave alias per aggirare lo scontro nello spazio dei nomi.Perché la direttiva "using namespace" è accettata nella pratica di codifica in C#?

Qualcuno può indicarmi che cosa non sto leggendo tra le righe in C# che rende accettabile l'uso della direttiva "using namespace" ed evita i problemi che C++ non può.

+0

Direi che preferirò mai aliasing di uno spazio dei nomi (diverso da 'System' o simili di base) per evitare conflitti nello spazio dei nomi, invece di inserire semplicemente un'istruzione' using namespace 'in C#! –

+0

Potrebbero essere diversi al 100%, tuttavia la domanda è ancora valida, come mai l'esposizione dei metodi/classi di un namespace va bene in C# ma non in C++? –

+0

@DanielFigueroa: Si scopre che ho completamente frainteso ciò che uso ha fatto in C#, sono abbastanza simili in realtà. Colpa mia. –

risposta

27

In C++, se si scrive using namespace in un'intestazione, quindi sarà in vigore per chiunque includa quell'intestazione. Questo lo rende praticamente inutilizzabile nelle intestazioni. A quel punto, si potrebbe anche evitarlo (a livello globale) nei file .cpp, anche se solo per motivi di coerenza, e per rendere più facili le implementazioni in movimento tra .h e .cpp.

(nota che con ambito locale using namespace - vale a dire all'interno di una funzione - sono generalmente considerati bene, è solo che non aiutano con verbosità tanto)

In C#, non c'è niente come #include, e il campo di applicazione una direttiva using non si estenderà mai oltre un singolo file .cs. Quindi è praticamente sicuro da usare ovunque.

L'altro motivo è il design della libreria standard. In C++, hai solo std (beh, ora ce ne sono ancora alcuni in meno, ma sono usati raramente). In C#, hai gemme come System.Collections.Generic, che è estremamente prolisso per qualcosa che viene usato molto comunemente. È molto più doloroso evitare using in C# rispetto al C++.

Per riassumere, mentre C# e C++ condividono alcune progettazioni comuni, in materia di modularità del codice (assegnerei intestazioni, moduli, spazi dei nomi tutti a quel gruppo), il loro design è molto diverso.

+1

Esatto. Includere un'intestazione in C++ è una inclusione di testo, non una inclusione simbolica. –

5

Per me, si tratta degli strumenti di supporto. Intellisense, la rapida ricerca della classe (tasto F1) e le opzioni di refactoring di Visual Studio offrono la necessaria funzionalità di ricerca di riferimento.

Inoltre, C# ha tutti i metodi all'interno di una classe - non ci sono funzioni a livello di spazio dei nomi.

+2

Più 1 per il tuo commento sulle funzioni a livello di spazio dei nomi - Penso che questa sia una parte importante del motivo per cui "l'uso dello spazio dei nomi" è disapprovato in C++. –

3

In generale una differenza di C# e C++ è il modo in cui le unità di compilazione vengono gestite e specificate.

C++ utilizza i file di intestazione per pubblicare dichiarazioni di classe e ha bisogno di un'unità di compilazione in cui questa classe sia implementata (definita). Un'istruzione using namespace <xxx> nei file di intestazione è pratica fortemente scoraggiata per C++, perché questo può facilmente portare a conflitti di spazio dei nomi e ambiguità quando inclusi da qualche codice client. Nella dichiarazione della classe è necessario indicare esplicitamente ciò che si desidera da altri spazi dei nomi (incluso std).

C# ha unità di compilazione singole che facilitano l'uso delle istruzioni using namespace <xxx> un po '. Ciononostante preferirei aliasing degli spazi dei nomi importati, se si vuole evitare una noiosa digitazione. L'inserimento delle istruzioni using in un file .cs potrebbe causare anche definizioni ambigue.

0

A meno che tu non sia un purista della lingua, fa risparmiare tempo e semplifica la codifica. A meno che non abbiate a che fare con sistemi complicati di namespace, è perfettamente accettabile.

1

Mentre sono completamente d'accordo con gli altri che l'uso dei namespace non dovrebbe essere fatto nelle intestazioni, penso che metterli al bando nei file cpp sia miope.Se si tenta di aderire all'organizzazione di dichiarazioni in spazi di nomi "piacevolmente", ma poi di vietare del tutto l'uso di "utilizzo dello spazio dei nomi", il percorso di minore resistenza per i programmatori diventa il sottoutilizzo dei namespace.

Ad esempio, nel post di cui sopra Pavel Minaev, giustamente sottolinea la differenza di spazio dei nomi tra uno spazio dei nomi C++, 'std' e uno spazio dei nomi C#, 'System.Collections.Generic'. Se ti fermi a pensare a perché sono così, una risposta chiara IMO è che la cultura di C++ aggrotta l'uso dello spazio dei nomi, mentre C# non lo fa, quindi in C# si accettano spazi dei nomi più prolissi perché non sono intrinsecamente dolorosi da usare. Credo che l'organizzazione dello spazio dei nomi in C# sia molto meglio del C++ in gran parte a causa di questa differenza culturale, e una migliore organizzazione di classe e leggibilità generale non sono cose banali.

Per mettere un altro modo, pensa a cosa accadrebbe alle abitudini di organizzazione dei file delle persone se un'applicazione richiedesse loro di digitare percorsi completi per caricare un file. Avrebbero più probabilmente spinto tutto in una cartella radice per evitare la digitazione, non un buon modo per promuovere l'organizzazione della qualità.

Anche se non è chiaro come usare la direttiva di C#, l'utilizzo dello spazio dei nomi nei file cpp è una vittoria generale.

Problemi correlati