2010-04-16 10 views
7

Eventuali duplicati:
Namespace only class visibility in C#/.NET ?lezioni private namespace all'interno

Quello che voglio è quello di avere una classe che è accessibile solo alle altre classi all'interno dello stesso spazio dei nomi senza dover mettere il namespace nella propria assemblea.

C'è un motivo per cui questo non è possibile in C#?

Edit: Ho cambiare la domanda un po ', dal momento che il compilatore mi dice che private non è permesso. Qualcuno può dirmi la ragione di questo?

+0

c'è qualcosa che non è stato chiesto? Mi sono perso quando ho scritto la domanda. Ma qualche idea sul perché è così? – user318253

+0

hehe ... Mi chiedo come le persone trovino post duplicati così velocemente anche se non sono nemmeno elencati nella sezione "Correlati" a destra. @ James: come si fa? :) – gehho

+0

Forse se dici perché devi farlo, le persone possono offrirti delle alternative? Così com'è, quello che vuoi fare è impossibile da raggiungere. –

risposta

2

Oltre alla risposta di gehho: lo spazio dei nomi è solo una parte del nome del tipo (che consente solo a tutti i tipi di avere nomi univoci) - ecco perché non è possibile limitare l'accesso ai tipi all'interno di uno spazio dei nomi.

+0

Quindi gli spazi dei nomi sono lì solo per evitare conflitti e non tanto per raggruppare come fa una cartella? Uno spazio dei nomi fornisce solo un contesto per i suoi tipi di contenimento - è quello che stai dicendo? – user318253

+0

@blacklion: pensa a uno spazio dei nomi come identificatore univoco per un tipo. Ti consente di avere 2 classi con lo stesso nome, ad es. 'System.DateTime' è diverso da' MyNamespace.DateTime' – James

+0

Grazie, penso che stavo pensando a pacchetti in java – user318253

5

Questo non è possibile.

È possibile limitare solo l'accesso al assemblaggio contenente la classe usando il modificatore internal.

È inoltre possibile limitare l'accesso alla classe a una singola classe rendendo la classe una classe nidificata. Per esempio. se rendi classe B una classe privata annidata in classe A, B sarà accessibile solo da A.

Penso che queste due opzioni siano le migliori che puoi fare. Se vuoi veramente limitare l'accesso allo spazio dei nomi, dovrai metterlo in un assembly separato.

EDIT: alla tua seconda domanda: perché una classe privata non è permesso. Le classi private sono consentite solo se sono nidificate all'interno di un'altra classe. Se rendi privata una classe non nidificata, qual è il suo uso? Non puoi accedervi comunque, quindi non puoi farci niente.

+0

C'è un motivo per cui questo non è possibile in C#? Perché i creatori non lo consentono? – user318253

+0

è davvero difficile fare domande qui. Devo esprimerlo così attentamente. per la tua modifica: ad esempio, per i tipi è consentito il privato all'interno delle classi e tutto all'interno della classe può accedervi. privato non limita TUTTO l'accesso a un tipo – user318253

+0

Non capisco il tuo commento. Questa è una domanda? In tal caso, riformularlo o fornire ulteriori dettagli. O pensi che la mia risposta sia sbagliata? – gehho

2

È possibile limitare la visibilità all'assieme corrente utilizzando una classe internal.

Tuttavia, è possibile consentire ad un altro assieme di ottenere visibilità all'assieme utilizzando l'attributo InternalsVisibleTo.

Esempio

Definire MyInternalClass in assemblea AssemblyOne:

[assembly: InternalsVisibleTo("AssemblyTwo")] 

internal class MyClass { 
    internal void DoSomeAction() { } 
} 

quindi definire un'altra classe in AssemblyTwo:

public class MyOtherClass 
{ 
    public void DoAnotherAction() 
    { 
     MyClass c = new MyClass(); 
     c.DoSomeAction(); 
    } 
} 
+0

Grazie, non era la mia domanda però – user318253

+0

@blacklion: Sì, non limita la visibilità allo spazio dei nomi. Ho frainteso la tua domanda. –

0

Poiché è possibile aggiungere tipi di namespace in qualsiasi altro montaggio esterno . Scriverà nello stesso spazio dei nomi, ma assemblaggi diversi vedranno i tuoi "tipi privati"?

Se no, abbiamo un comportamento difficile da comprendere (un tipo da namespace potrebbe vedere il tuo tipo, un altro - no). Se sì, abbiamo una contraddizione con la definizione di "privato", perché i tipi in diversi assembly avrebbero accesso ai dettagli "privati" dell'assemblaggio.

+0

vedi Thibault Risposta falsa relativa a InternalsVisibleTo – user318253

0

È possibile dichiarare spazi dei nomi arbitrari, quindi è possibile dichiarare le proprie classi come parte dello spazio dei nomi di sistema, ad esempio. Ovviamente, ciò comporterà un errore se Microsoft deciderà di aggiungere una classe con lo stesso nome al proprio spazio dei nomi.

Perché vuoi avere "visibilità spazio dei nomi"? Significherebbe un tipo speciale di pubblico, dal momento che chiunque potrebbe dichiarare la propria classe come nello spazio dei nomi richiesto e quindi accedere alle classi.

Se lo si desidera come funzione di sicurezza, questo non funzionerà. Ad esempio, se vuoi declassare il tuo spazio dei nomi nascondendo classi "interne", potresti avere uno spazio dei nomi Internals sotto il tuo spazio dei nomi principale.