2010-12-15 51 views
16

Estoy tratando de entender el modificador de acceso interno en C#. Parece que no puedo entender qué es exactamente un ensamblaje, y qué parte de mi programa se guarda dentro de ese ensamblaje. Yo estaba tratando de hacerlo de modo que una variable es accesible solamente por los objetos dentro del espacio de nombres siguiente:ensambles C#, ¿qué hay en un ensamblaje?

namespace Engine.Entity 

la variable en cuestión se define en una clase dentro de ese espacio de nombres, así que supuse que si lo hice interna, solo los objetos dentro de ese espacio de nombres tienen acceso a él. Estoy viendo asambleas y espacios de nombres como uno, y no creo que eso sea correcto.

+2

Eche un vistazo al programa ".Net Reflector". Te permitirá abrir una asamblea y ver qué hay en ella. Verá que un solo ensamblaje puede contener múltiples espacios de nombres. – David

Respuesta

19

Los espacios de nombre afectan solo a la resolución del nombre. Los espacios de nombre no implican ningún tipo de almacenamiento, ni los espacios de nombres determinan qué DLL contienen su código. Los espacios de nombre le permiten agrupar elementos relacionados bajo un nombre lógico aunque físicamente residan en diferentes archivos DLL.

Un ensamblaje es básicamente un archivo DLL o EXE. Contiene información de código y tipo de IL que describe el código en esa DLL o EXE. Puede contener muchas otras cosas también, pero para empezar solo piensa en ello como una DLL.

Usted pone su código en un ensamble en particular compilando su código en un proyecto (csproj) que produce el DLL o EXE.

Un espacio de nombre puede abarcar varios conjuntos. Es decir, las clases que son miembros de ese espacio de nombre lógico pueden residir en varias DLL. Puede acceder a una clase en particular en su código fuente solo si su proyecto hace referencia al ensamblado correcto (DLL) que contiene esa clase.

El modificador interno significa que solo se puede acceder al símbolo desde el mismo ensamblaje. Solo el código que se compila en la misma DLL que su código puede acceder a sus propiedades o métodos etiquetados con internos.

+0

"Un ensamblaje es básicamente un archivo DLL o EXE". Es cierto, pero a veces puede ser cualquier tipo de archivo (jpegs, archivos de texto, etc.) o varios al mismo tiempo. Sin embargo, es el caso límite (ver mi respuesta en esta publicación). –

+0

Sí, un ensamblaje puede contener/contener todo un lío de cosas. No relevante al nivel de esta pregunta. – dthorpe

1

De internal (C# Reference)

La palabra clave interna es un modificador de acceso de tipos y miembros de tipo. tipos internos o miembros son accesible sólo dentro de los archivos en el mismo conjunto

Así que esto significa desde el interior de la misma asamblea/DLL, no namespace.

0

Básicamente, no puede hacer que una variable sea visible solo desde dentro de un espacio de nombres dado. Como cualquiera puede definir cualquier espacio de nombres, esto haría que la idea de internal vacío: sólo tendría que escribir

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

para poder acceder a cualquier variable, clase o método definido como internal en el System espacio de nombres, por ejemplo.

0

Los espacios de nombres y los ensamblados no son sinónimos. A menudo, un espacio de nombres abarca varios conjuntos. Cualquier código administrado creado desde Visual Studio tiene una correspondencia uno a uno de proyectos a ensamblajes a archivos binarios DLL/EXE.

Sin embargo, si vincula su código administrado con la línea de comando, puede crear un ensamblado donde todos los archivos de proyecto pertenezcan a un ensamblaje (lo que significa que varios archivos en su disco representan un ensamblaje). Pero no importa este caso, es algo esotérico que nunca ocurre en la práctica.

El modificador de acceso "interno" simplemente significa que solo se puede acceder al objetivo desde ese ensamblaje. No tiene relación con los espacios de nombres.

5

Las personas se confunden fácilmente con el espacio de nombres/ensamblaje, ya que desacopla el concepto de ubicación física del código (el ensamblado) y cómo se hace referencia (lógicamente la referencia es mediante el espacio de nombres y la referencia física haciendo referencia la Asamblea).

generalmente explico esto usando la palabra contribute:

  1. Un montaje puede contribuir a varios espacios de nombres.
    Por ejemplo, el ensamblaje System.Data.dll contribuye a los espacios de nombres como System.Data (por ejemplo, la clase System.Data.DataTable) y Microsoft.SqlServer.Server (por ejemplo, la clase Microsoft.SqlServer.Server.SqlContext).

  2. Varios ensamblados pueden contribuir a un solo espacio de nombres.
    Por ejemplo, tanto el ensamblaje System.Data.dll como el ensamblaje System.Xml.dll contribuyen al espacio de nombre System.Xml.
    Lo que significa que si usa la clase System.Xml.XmlDataDocument de su proyecto, necesita hacer referencia al ensamblaje System.Data.dll.
    Y si usa la clase System.Xml.XmlDocument, necesita hacer referencia al System.Xml.dll de su proyecto.

(los ejemplos anteriores son .NET 4.0, pero probablemente también para las versiones anteriores de .NET).

Danny Thorpeexplained el concepto de namespace y internal muy bien, así que no voy a entrar en detalles sobre ellos.

--jeroen

+1

+1: explicación muy clara para un principiante de C# como yo – Guillaume07

Cuestiones relacionadas