Modificadores de acesso interno vs. privado

Respostas:

516

internal é para escopo de assembly (ou seja, acessível apenas a partir do código no mesmo .exe ou .dll)

private é para o escopo da classe (ou seja, acessível apenas a partir do código da mesma classe).

explorador
fonte
6
eu tenho uma pergunta rápida; se eu declarar uma classe como privada em um espaço para nome dentro de uma montagem versus a classe sendo interna, posso acessar essa classe dentro da montagem nos dois casos, então qual é a diferença entre uma classe privada e uma classe interna? ou são modificadores privados e internos em termos de classes usados ​​ao aninhar uma classe dentro da classe?
mayotic
2
Eu adicionei o projeto / montagem específico como referência de outro projeto e tanto o privado quanto o interno me impedem de acessar essa classe específica dentro do namespace, então, novamente ... a diferença entre classes privadas e internas é? graças
mayotic
9
Você não pode declarar uma classe de nível superior como privada. O compilador irá pará-lo.
TheGateKeeper
6
@NetSkay: Se você declarar uma classe privada dentro de uma classe pública, essa classe não poderá ser acessada por outras classes em sua montagem, mas se você declarar essa classe como interna, poderá ser acessada na montagem. Embora ambos não sejam acessíveis fora da montagem.
Yogesh Jindal
2
Se você é proveniente de um plano de fundo do VB.NET, a palavra-chave "interna" do C # é equivalente à palavra-chave "Amigo" do VB.NET.
precisa saber é o seguinte
207

Encontre uma explicação abaixo. Você pode verificar este link para obter mais detalhes - http://www.dotnetbull.com/2013/10/public-protected-private-internal-access-modifier-in-c.html

Privado: - Membros privados são acessíveis apenas dentro do próprio tipo (classe própria).

Interno: - O membro interno é acessível somente dentro da montagem por herança (seu tipo derivado) ou por instância da classe.

insira a descrição da imagem aqui

Referência:

dotnetbull - o que é modificador de acesso em c #

Vivek
fonte
17
Interessante que Protected Internalfornece acesso mais amplo do que Protected.
precisa
9
@ Dan, concordo plenamente. Pode ser útil ler e pensar protected internalcomo protected OR internal.
chessofnerd 9/09/16
7
O que With Typesignifica isso ?
James Wierzba
@ Dan sim, eu assumi que iria apenas agir como uma tabela de verdade e ANDessa matriz para true | false | false | false for protected internal. não é intuitivo. em vez disso, é verdadeiro | verdadeiro | verdadeiro | falso como se OR'd.
ferr 29/05
11
Aliás, o C # 7.2 acabou de adicionar um modificador "protegido E interno", embora as palavras-chave escolhidas private protectednão sejam muito intuitivas. Para obter detalhes: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Joe Sewell
70

internalmembros são visíveis para todo o código no assembly em que estão declarados.
(E para outros assemblies referenciados usando o [InternalsVisibleTo]atributo )

privateOs membros são visíveis apenas para a classe declarante. (incluindo classes aninhadas)

Uma classe externa (não aninhada) não pode ser declarada private, pois não há escopo de contenção para torná-la privada.

Para responder à pergunta que você esqueceu de fazer, os protectedmembros são como privatemembros, mas também são visíveis em todas as classes que herdam o tipo de declaração. (Mas apenas em uma expressão de pelo menos o tipo da classe atual)

SLaks
fonte
8

private - encapsulamentos na classe / escopo / estrutura '.

encapsulamento interno em montagens.

Yaniv Lugassy
fonte
6

Os membros privados são acessíveis apenas no corpo da classe ou na estrutura em que são declarados.

Tipos ou membros internos são acessíveis apenas em arquivos no mesmo assembly

Jesper Fyhr Knudsen
fonte
então qual é a diferença em usar isso? Eu ainda não entendo: X
deadfish
4
Privado é acessível somente dentro da Classe, Interno é acessível dentro da Assembléia (projeto no VS, isto é, arquivo dll / exe).
Jesper Fyhr Knudsen
3

Internal permitirá que você faça referência, digamos, a uma classe estática de Acesso a Dados (para segurança do encadeamento) entre várias classes de lógica de negócios, sem inscrevê-las para herdar essa classe / trip entre si em conjuntos de conexões e evitar a permissão de uma classe DAL promover o acesso ao nível público. Isso tem inúmeros apoios no design e nas melhores práticas.

O Entity Framework faz bom uso desse tipo de acesso

Nathan Teague
fonte
0

membros internos são acessíveis dentro da montagem (somente acessíveis no mesmo projeto)

membros privados são acessíveis na mesma classe

Exemplo para Iniciantes

Existem 2 projetos em uma solução (Projeto1, Projeto2) e o Projeto1 tem uma referência ao Projeto2.

  • O método público escrito no Projeto2 estará acessível no Projeto2 e no Projeto1
  • O método interno escrito no Projeto2 estará acessível apenas no Projeto2, mas não no Projeto1
  • O método privado escrito na classe1 do Projeto2 estará acessível apenas à mesma classe. Ele também não estará acessível em outras classes do Projeto 2 e não no Projeto 1.
Salik
fonte