internal (Referencia de C#)

La palabra clave internal es un modificador de acceso para tipos y miembros de tipo.

Esta página trata sobre el modificador de acceso internal. La palabra clave internal también forma parte del modificador de acceso protected internal.

Solo se puede tener acceso a los tipos internos o los miembros desde los archivos del mismo ensamblado, como en este ejemplo:

public class BaseClass
{  
    // Only accessible within the same assembly.
    internal static int x = 0;
}  

Para obtener una comparación de internal con los demás modificadores de acceso, vea Niveles de accesibilidad y Modificadores de acceso.

Para más información sobre los ensamblados, consulte Ensamblados en .NET.

Un uso común del acceso interno se da en el desarrollo basado en componentes porque permite que un grupo de componentes cooperen de manera privada sin estar expuesto al resto del código de la aplicación. Por ejemplo, un marco para crear interfaces gráficas de usuario podría proporcionar las clases Control y Form que cooperan mediante miembros con acceso interno. Como estos miembros son internos, no se exponen al código que usa el marco de trabajo.

Es un error hacer referencia a un tipo o miembro con acceso interno fuera del ensamblado en el que se definió.

Ejemplo 1

Este ejemplo contiene dos archivos, Assembly1.cs y Assembly1_a.cs. El primer archivo contiene una clase base interna, BaseClass. En el segundo archivo, un intento de crear una instancia de BaseClass producirá un error.

// Assembly1.cs  
// Compile with: /target:library  
internal class BaseClass
{  
   public static int intM = 0;  
}  
// Assembly1_a.cs  
// Compile with: /reference:Assembly1.dll  
class TestAccess
{  
   static void Main()
   {  
      var myBase = new BaseClass();   // CS0122  
   }  
}  

Ejemplo 2

En este ejemplo, use los mismos archivos usados en el ejemplo 1 y cambie el nivel de accesibilidad de BaseClass a public. Cambie también el nivel de accesibilidad del miembro intM a internal. En este caso, se puede crear una instancia de la clase, pero no se puede tener acceso al miembro interno.

// Assembly2.cs  
// Compile with: /target:library  
public class BaseClass
{  
   internal static int intM = 0;  
}  
// Assembly2_a.cs  
// Compile with: /reference:Assembly2.dll  
public class TestAccess
{  
   static void Main()
   {  
      var myBase = new BaseClass();   // Ok.  
      BaseClass.intM = 444;    // CS0117  
   }  
}  

Especificación del lenguaje C#

Para obtener más información, vea la sección Accesibilidad declarada de la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.

Vea también