internal (Referência de C#)

A palavra-chave internal é um modificador de acesso para tipos e membros de tipo.

Esta página aborda o acesso internal. A palavra-chave internal também faz parte do modificador de acesso protected internal.

Tipos ou membros internos são acessíveis somente em arquivos no mesmo assembly, como neste exemplo:

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

Para obter uma comparação de internal com os outros modificadores de acesso, consulte Níveis de acessibilidade e Modificadores de acesso.

Um assembly é uma DLL (biblioteca de vínculo dinâmico) executável ou dinâmica produzida com base na compilação de um ou mais arquivos de origem.

Para saber mais sobre assemblies, confira Assembly no .NET.

Um uso comum do acesso interno é no desenvolvimento baseado em componente, porque ele permite que um grupo de componentes colabore de maneira particular, sem serem expostos para o restante do código do aplicativo. Por exemplo, uma estrutura para a criação de interfaces gráficas do usuário pode fornecer as classes Control e Form, que cooperam através do uso de membros com acesso interno. Uma vez que esses membros são internos, eles não são expostos ao código que está usando a estrutura.

É um erro fazer referência a um tipo ou um membro com acesso interno fora do assembly no qual ele foi definido.

Exemplo 1

Este exemplo contém dois arquivos, Assembly1.cs e Assembly1_a.cs. O primeiro arquivo contém uma classe base interna BaseClass. No segundo arquivo, uma tentativa de instanciar a BaseClass produzirá um erro.

// 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  
   }  
}  

Exemplo 2

Neste exemplo, use os mesmos arquivos que você usou no exemplo 1 e altere o nível de acessibilidade da BaseClass para public. Também altere o nível de acessibilidade do membro intM para internal. Nesse caso, você pode instanciar a classe, mas não pode acessar o membro 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  
   }  
}  

Especificação da Linguagem C#

Para obter mais informações, veja Acessibilidade declarada na Especificação da Linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Confira também