C # – Dichiarazione di tipi all’interno di uno spazio dei nomi

quale potrebbe essere un ansible uso di dichiarare tipi all’interno di un namespace ma non in una class.

Per esempio:

namespace Test { public delegate void Ispossible(); } 

Questo è valido e non genera errori di compilazione, ma non riesco a pensare al perché lo dichiareremmo in questo modo anziché all’interno di una class.

Uno spazio dei nomi è un’unità di organizzazione di alto livello all’interno di .NET.

Dichiarare i tipi all’interno delle classi è generalmente disapprovato (ma, come con tutte le cose, non è una regola del 100%) perché può rendere i tipi più strettamente accoppiati e più difficili da trovare.

I moduli VB.NET sono in qualche modo un’eccezione ( edit : sono molto più di un trucco per compilatore / sintattico-zucchero), ma normalmente tutto nell’ecosistema .NET è contenuto in uno spazio dei nomi.

Il tuo esempio si presta a riutilizzare; se fosse all’interno di una class, ciò implicherebbe che il delegato dovrebbe essere usato solo da quella class e probabilmente porterà all’introduzione inutilmente di duplicati di delegati.


Aggiornamento: quando si lavora con solo una manciata di tipi di spazi dei nomi non sembra molto utile, ma senza di essi un progetto di qualsiasi dimensione sarebbe una catastrofe organizzativa. Immagina il framework .NET senza spazi dei nomi, un conteggio (probabilmente da lungo tempo superato) pone il framework su 3500 Tipi.

I namespace sono come cartelle o cassetti per i documenti; alcuni documenti sciolti sono facili da gestire, ma se hai molte pagine, trovare quello che ti serve diventa doloroso.

Dai alla documentazione una lettura, è breve e non eccessivamente complicata (nessuno dei due è lo spazio dei nomi) ma ha un paio di punti decenti MSDN – Namespace (c #)

Se si tratta di un delegato multiuso come Func , EventHandler che non è correlato a una particolare class, è necessario dichiararlo direttamente nello spazio dei nomi.

Il tuo fraseggio (“quello che potrebbe essere un ansible uso di dichiarare tipi all’interno di un namespace ma non in una class.”), Indica che si disegna una distinzione tra “tipi” e “classi”. Non c’è nessuno. Una class è un tipo.

Quindi, in quali condizioni vorresti dichiarare una class direttamente in uno spazio dei nomi (ad esempio, come è più comunemente fatto)? Queste stesse ragioni si applicano ad altri tipi di tipi.

Entrambi gli spazi dei nomi e le classi possono essere utilizzati per organizzare le informazioni in gerarchia. Tuttavia, gli spazi dei nomi consentono di distribuire la definizione attraverso i contorni delle DLL, ma le classi no. Anche le classi richiedono di mettere il nome della class prima del nome del tipo, ma gli spazi dei nomi consentono di usare la parola chiave “using”.

Quindi, se si desidera definire i delegati in uno spazio dei nomi in dll differenti, si utilizzano gli spazi dei nomi.

Se si desidera forzare le persone a prefixare il nome del tipo con un altro nome senza poter contare sul contesto dello spazio dei nomi, si utilizzano le classi.