C# Interno

Resumo : neste tutorial, você aprenderá a usar a internalpalavra-chave C# para restringir tipos e seus membros para serem acessíveis no mesmo assembly.

Introdução à palavra-chave interna C#

No .NET, um assembly é um pacote de código e recursos que o tempo de execução do .NET pode implantar, versionar e executar, e os desenvolvedores podem usar para criar aplicativos ou bibliotecas.

Para criar um assembly a partir do código, você compila o código em um arquivo DLLou EXEarquivo. Então, você ou outros desenvolvedores poderão fazer referência ao assembly de outro projeto.

A palavra-chave C# internalespecifica que tipos como classes e interfaces ou membros de tipos devem ser acessíveis apenas dentro do mesmo assembly, também conhecido como escopo de assembly. Em outras palavras, se um tipo ou membro de um tipo estiver marcado como internal, outros assemblies não poderão acessá-lo diretamente.

A internalpalavra-chave permite ocultar efetivamente os detalhes da implementação. Também garante que sua biblioteca seja usada conforme pretendido, sem expor os detalhes internos a montagens externas. Isso torna seu código mais sustentável e seguro.

Digamos que você desenvolva uma biblioteca C# chamada MyLibque contém uma Utilityclasse que deseja usar em seus projetos dentro da mesma solução. Mas você não quer que outros desenvolvedores acessem a Utilityclasse e seus métodos a partir de seus assemblies fora da sua biblioteca.

Para fazer isso, você pode usar a internalpalavra-chave da Utilityclasse e seu método assim:

namespace MyLib
{
    internal class Utility
    {
        internal static void Calculate()
        {
        }
    }

    class MyClass
    {
        public static void DoSomething()
        {
            Utility.Calculate();
            
            // ...
        }
    }

}Linguagem de código:  C#  ( cs )

Neste exemplo, marcamos a Utilityclasse e seu Calculate()método como internal. Isso significa que só permitimos acesso a eles dentro do mesmo assembly ( MyLibprojeto).

Por outro lado, marcamos o MyClasscomo public, o que significa que permitimos que outros assemblies façam referência ao MyClass.

É importante observar que se você tentar acessar a Utilityclasse ou seu Calculate()método a partir de outro assembly, ocorrerá um erro de compilação.

Interno Protegido

O protected internalmodificador de acesso é uma combinação dos modificadores protectede internal. O protected internalpermite acesso a membros de dentro do mesmo assembly, bem como de classes derivadas em qualquer assembly, mais especificamente:

  • Um protected internalmembro pode ser acessado de qualquer classe dentro do mesmo assembly, assim como um internalmembro.
  • Um protected internalmembro também pode ser acessado de uma classe derivada em qualquer assembly, assim como um protectedmembro.

Aqui está um exemplo de uso do protected internalmodificador de acesso:

// Assembly1

namespace MyLib;

public class MyBaseClass
{
    protected internal int MyProtectedInternalField;
}

public class MyDerivedClass: MyBaseClass
{
    public void DoSomething()
    {
        var value = MyProtectedInternalField;
        Console.WriteLine(value);
    }
}
Linguagem de código:  C#  ( cs )

Neste exemplo, the MyBaseClasstem um protected internalmembro. Portanto, podemos acessá-lo a partir do DoSomething()método da classe derivada dentro do mesmo assembly.

// Assembly2
using MyLib;

namespace MyLib2;

public class MyClass : MyDerivedClass
{
    public void MyMethod()
    {
        // reference the protected internal field 
        // from the MyDerivedClass in another assembly
        var value = MyProtectedInternalField;
        
        //...
        
    }
}Linguagem de código:  C#  ( cs )

Nesta montagem, definimos o MyClassque estende a MyDerivedClassclasse de Assembly1.

O MyMethod()do MyClasspode acessar o MyProtectedInternalFieldmembro do MyDerivedClassdo Assembly1.

Resumo

  • Use a internalpalavra-chave C# para permitir que tipos e seus membros sejam acessíveis no mesmo assembly.
  • Use o protected internalmodificador para permitir que um membro seja acessado dentro do mesmo assembly, bem como da classe derivada do mesmo ou de outro assembly.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *