interno vs público em c #


92

Eu quero saber a diferença entre os modificadores de visibilidade publice internal.

Quando devemos usar internalem uma aula e quando public? Estou confuso sobre quando um método deveria ser publicou internal.

Li que internalpode ser acessado através da Assembleia, enquanto publictambém pode ser utilizado através da montagem onde está a diferença.

Respostas:


101

public é visível de qualquer lugar.

internal é visível apenas dentro de uma montagem

Você tende a usar interno apenas para proteger APIs internas. Por exemplo, você pode expor várias sobrecargas de um método:

public int Add(int x, int y)
public int Add(int x,int y, int z)

Ambos chamam o método interno

internal int Add(int[] numbers)

Você pode então colocar muita sofisticação em um método, mas "protegê-lo" usando métodos de fachada que podem ajudar o programador a chamar o método corretamente. (O método de implementação com o parâmetro de matriz pode ter um limite arbitrário de valores, por exemplo.)

Também vale a pena notar que usando o Reflection, todo e qualquer método pode ser chamado, independentemente de sua visibilidade. Outro "hack" para controlar / obter acesso a APIs ocultas internamente.


5
em uma classe interna, posso declarar os métodos públicos ..?
NoviceToDotNet de

Não, pois isso causaria um conflito. O compilador irá informá-lo sobre isso e não conseguirá compilar.
Programa X

14
@ Program.X: Na verdade, você pode e o compilador não lhe diz nada.
OR Mapper

Na verdade, eu vim aqui pesquisando se isso é ou não um recurso. Imagine fazer a aula internale todos os métodos public. Se precisar de maior visibilidade, você pode definir a classe inteira publicnovamente. Mas não tenho certeza se ele deve ou não ser usado dessa forma. Então eu continuo pesquisando ... edite Et voilà, mesmo tópico: stackoverflow.com/questions/9302236/…
ecth

31

internalé útil quando você deseja declarar um membro ou tipo dentro de uma DLL, não fora
dela ... normalmente, quando você declara um membro, já Publicque pode acessá-lo de outras DLLs. mas, se você precisar declarar algo como público apenas dentro de sua biblioteca de classes, poderá declará-lo como Internal.
na definição formal: os membros internos são visíveis apenas dentro da assembleia atual ...


11

internaltambém é útil ao escrever testes de unidade. O InternalsVisibleToatributo permite que seu assembly de teste acesse métodos internos em seu assembly de código. Ou seja, você pode testar métodos que parecem privados para o mundo externo sem usar reflexão.


6

O público também pode ser acessado fora da assembleia. Portanto, quando você tem uma classe que não deve ser acessada, todas as classes do assembly devem ser capazes de acessá-la, então, internal é a coisa certa. Se você precisar de acesso externo, use público.


4

Além disso, as propriedades marcadas como internallançarão um BindingExpression path errorif usado para DataBinding no WPF. Portanto, eles precisam estar publicfuncionando corretamente, mesmo quando o DataBinding ocorre no mesmo assembly.


-3

Se você pode referenciar o assemble de fora, você tem escopo de classes internas e públicas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.