2013-08-27 22 views
33

In java si dispone di una protezione a livello di pacchetto che garantisce che le classi siano utilizzabili solo all'interno del pacchetto.Modificatore di accesso C# per esporre la classe solo all'interno del namespace

Gli spazi dei nomi in C# funzionano più o meno come pacchetti. Ma C# non ha un livello di protezione per proteggere le classi all'interno di uno spazio dei nomi.

C'è una ragione specifica per questo?

+0

C# ha assembly ed è possibile utilizzare la parola chiave 'internal'. –

risposta

14

Non esiste un tale modificatore di accesso: il modificatore più vicino è internal, ma l'unità di protezione è l'assembly in cui risiede la classe, non il suo spazio dei nomi.

Si potrebbe obiettare che è possibile ottenere un livello di controllo simile usando internal, perché entrambi i tipi di restrizioni impediscono agli estranei di accedere ai dettagli di implementazione della libreria. L'unica persona a cui fa la differenza sei tu, lo scrittore della biblioteca, e hai il pieno controllo di cosa esporre e cosa nascondere comunque. Essenzialmente, significa che se non vuoi usare una classe al di fuori del suo spazio dei nomi, semplicemente evita di usarla; se la classe è internal, nessun altro sarà in grado di utilizzare quella classe.

+1

Questo è vero. Ma potresti voler nascondere i dettagli di implementazione ai consumatori del codice che costruisce la libreria. Mi stavo principalmente chiedendo perché la differenza esiste. – Jaco

+2

@Jaco Se si desidera nascondere una classe ad altre persone che scrivono il codice per lo stesso assembly con la classe, si presume che siano i tuoi colleghi di lavoro. Se iniziano a usare le tue classi interne, puoi andare da loro e fare una bella conversazione pacifica che spiega i pericoli dell'uso di qualcosa che non è stato pensato per loro :-) – dasblinkenlight

+0

Non puoi nascondere nulla perché uno si decompilatore e vede tutto ciò di cui hanno bisogno. Seriamente, Namespace non regola nulla. È come chiudere il PC. Il modificatore di accesso di classe regola tutto. In effetti, se si ha spazio dei nomi senza alcun tipo pubblico, quando si fa riferimento all'assemblaggio, non si vedrà nemmeno quel namespace. –

2

In .NET ci sono assemlies (DLL o file exe), è possibile utilizzare il modificatore internal per limitare l'accesso solo all'interno dello stesso assieme

1

C'è un motivo specifico per questo?

Per lo più, è perché ci sono alcuni chiave differences between packages and namespaces

Per semplificare ciò che è già stato detto nella questione legata e qui: namespace in C# sono per lo più per aiutare con l'organizzazione di contenuti di un assieme, sia internamente che esternamente. I pacchetti Java hanno più in comune con gli assembly C# e c'è un modificatore di accesso in C# che limita il livello dell'assieme: internal.

Problemi correlati