2010-12-15 13 views
16

Sto cercando di capire il modificatore di accesso interno in C#. Non riesco a capire cosa sia esattamente un assemblaggio e quale parte del mio programma si trovi all'interno di quell'assemblea. Cercavo di fare in modo che una variabile è accessibilmente solo dagli oggetti nel seguente spazio:C# assemblati, che cosa è un assieme?

namespace Engine.Entity 

variabile in questione è definita in una classe all'interno di tale spazio, così ho assunto se ho fatta interna, solo gli oggetti all'interno di tale spazio dei nomi hanno accesso ad esso. Sto vedendo assembly e namespace come uno, e non penso che sia giusto.

+2

Dai un'occhiata al programma ".Net Reflector". Ti permetterà di aprire un assemblaggio e vedere cosa c'è dentro. Vedrai che un singolo assembly può contenere più spazi dei nomi. – David

risposta

19

Gli spazi dei nomi influiscono solo sulla risoluzione dei nomi. I namespace non implicano alcun tipo di archiviazione, né i namespace determinano quali DLL contengono il tuo codice. I namespace consentono di raggruppare le cose correlate insieme sotto un nome logico anche se possono risiedere fisicamente in DLL diverse.

Un assembly è fondamentalmente solo un file DLL o EXE. Contiene codice IL e informazioni sul tipo che descrivono il codice in quella DLL o EXE. Può contenere anche molte altre cose, ma per i principianti basti pensare a una DLL.

Si inserisce il codice in un particolare assieme compilando il codice in un progetto (csproj) che produce la DLL o l'EXE.

Uno spazio dei nomi può estendersi su più assiemi. Cioè, le classi che sono membri di quel namespace logico possono risiedere in più DLL. È possibile accedere a una classe particolare nel codice sorgente solo se il progetto fa riferimento all'assembly (DLL) corretto che contiene quella classe.

Il modificatore interno significa che è possibile accedere al simbolo solo dallo stesso gruppo. Solo il codice che viene compilato nella stessa DLL del codice può accedere alle proprietà o ai metodi con etichetta interna.

+0

"Un assembly è fondamentalmente una DLL o un EXE." Vero, ma a volte può essere qualsiasi tipo di file (jpegs, file di testo, ecc.) O diversi allo stesso tempo. È il caso limite (vedi la mia risposta su questo post). –

+0

Sì, un assembly può essere/contenere un intero casino di cose. Non pertinente al livello di questa domanda. – dthorpe

1

Da internal (C# Reference)

La parola interna è un modificatore di accesso per tipi e membri tipo. tipi interne o membri sono accessibili solo all'interno di file nella stessa assemblea

Quindi questo significa che all'interno della stessa assemblea/dll, non namespace.

0

Fondamentalmente, non è possibile rendere visibile una variabile solo all'interno di un determinato spazio dei nomi. Come chiunque può definire qualsiasi spazio dei nomi, questo renderebbe l'idea di internal vuoto: si sarebbe solo dovuto scrivere

namespace System 
{ 
    public static MySystemInternalSpy 
    { 
     public static void SpyInternals() 
     { 
      ... 
     } 
    } 
} 

per accedere a qualsiasi variabile, classe o un metodo definito come internal nel System spazio dei nomi, per esempio.

0

Gli spazi dei nomi e gli assiemi non sono sinonimi. Spesso uno spazio dei nomi si estende su più assiemi. Qualsiasi codice gestito creato da Visual Studio ha una corrispondenza uno per uno dei progetti per gli assembly ai binari DLL/EXE.

Tuttavia, se si collega il codice gestito con la riga di comando, è possibile creare un assieme in cui più file di progetto appartengono tutti a un assieme (il che significa che più file sul disco rappresentano insieme un assieme). Ma non importa questo caso, è una cosa esoterica che non si verifica mai nella pratica.

Il modificatore di accesso "interno" indica semplicemente che è possibile accedere alla destinazione solo all'interno di tale assieme. Non ha influenza sugli spazi dei nomi.

5

Le persone sono facilmente confuse dallo spazio namespace/assembly, in quanto separa il concetto di dove si trova fisicamente il codice (l'assembly) e il modo in cui lo si fa riferimento (il riferimento logico è utilizzando lo spazio dei nomi e il riferimento fisico è facendo riferimento l'assemblea).

Io di solito spiegare questo usando la parola contribute:

  1. Un gruppo può contribuire a più domini.
    Ad esempio, l'assembly System.Data.dll contribuisce a spazi dei nomi come System.Data (ad esempio la classe System.Data.DataTable) e Microsoft.SqlServer.Server (ad esempio la classe Microsoft.SqlServer.Server.SqlContext).

  2. Più assiemi possono contribuire a un singolo spazio dei nomi.
    Ad esempio, sia l'assemblaggio System.Data.dll sia l'assieme System.Xml.dll contribuiscono allo spazio dei nomi System.Xml.
    Ciò significa che se si utilizza la classe System.Xml.XmlDataDocument dal progetto, è necessario fare riferimento all'assembly System.Data.dll.
    E se si utilizza la classe System.Xml.XmlDocument, è necessario fare riferimento allo System.Xml.dll dal progetto.

(gli esempi precedenti sono .NET 4.0, ma probabilmente validi anche per versioni .NET precedenti).

Danny Thorpeexplained il concetto di namespace e internal davvero bene, quindi non voglio entrare nel dettaglio di quelli.

- jeroen

+1

+1: spiegazione molto chiara per un principiante di C# come me – Guillaume07