Qual é o modificador de acesso padrão para classes, métodos, membros, construtores, delegados e interfaces?
fonte
Qual é o modificador de acesso padrão para classes, métodos, membros, construtores, delegados e interfaces?
O acesso padrão para tudo em C # é "o acesso mais restrito que você pode declarar para esse membro" .
Então, por exemplo:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
é equivalente a
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
O único tipo de exceção a isso é tornar uma parte de uma propriedade (geralmente o setter) mais restrita do que a acessibilidade declarada da própria propriedade:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Isto é o que a especificação do C # 3.0 tem a dizer (seção 3.5.1):
Dependendo do contexto em que uma declaração de membro ocorre, apenas certos tipos de acessibilidade declarada são permitidos. Além disso, quando uma declaração de membro não inclui nenhum modificador de acesso, o contexto em que a declaração ocorre determina a acessibilidade declarada padrão.
- Os espaços para nome implicitamente têm acessibilidade declarada pública. Nenhum modificador de acesso é permitido nas declarações do espaço para nome.
- Os tipos declarados em unidades de compilação ou espaços de nome podem ter acessibilidade declarada pública ou interna e usar como padrão a acessibilidade declarada interna.
- Os membros da classe podem ter qualquer um dos cinco tipos de acessibilidade declarada e usar como padrão a acessibilidade declarada privada. (Observe que um tipo declarado como membro de uma classe pode ter qualquer um dos cinco tipos de acessibilidade declarada, enquanto um tipo declarado como membro de um espaço para nome pode ter apenas acessibilidade declarada pública ou interna.)
- Os membros do Struct podem ter acessibilidade declarada pública, interna ou privada e usar como padrão a acessibilidade declarada privada porque as estruturas são implicitamente seladas. Os membros de estrutura introduzidos em uma estrutura (isto é, não são herdados por essa estrutura) não podem ter acessibilidade declarada interna protegida ou protegida. (Observe que um tipo declarado como membro de uma estrutura pode ter acessibilidade declarada pública, interna ou privada, enquanto um tipo declarado como membro de um espaço para nome pode ter apenas acessibilidade declarada pública ou interna.)
- Os membros da interface implicitamente têm acessibilidade declarada pública. Nenhum modificador de acesso é permitido nas declarações dos membros da interface.
- Os membros da enumeração implicitamente têm acessibilidade declarada pública. Nenhum modificador de acesso é permitido nas declarações dos membros da enumeração.
(Observe que os tipos aninhados seriam incluídos nas partes "class members" ou "struct members" - e, portanto, usarão como padrão a visibilidade privada.)
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
, você não pode acessarM
coma.M()
, no entanto, você pode acessá-lo com(a as IFoo).M()
. (Confira a especificação para mais informações sobre as especificidades)Resposta curta: acesso mínimo possível (cf. resposta de Jon Skeet).
Resposta longa:
Tipos não aninhados , enumeração e delegação de acessibilidade ( podem ter apenas acessibilidade interna ou pública )
Acessibilidade de tipo e membro aninhado
A acessibilidade de um tipo aninhado depende de seu domínio de acessibilidade, que é determinado pela acessibilidade declarada do membro e pelo domínio de acessibilidade do tipo que contém imediatamente. No entanto, o domínio de acessibilidade de um tipo aninhado não pode exceder o domínio do tipo que o contém.
Nota: O CIL também possui a provisão para protegido e interno (em oposição ao existente protegido "ou" interno), mas, pelo que sei, isso não está disponível atualmente para uso em C #.
Vejo:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en- us / library / cx03xt0t.aspx
(Homem que eu amo URIs da Microsoft ...)
fonte
Dê uma olhada em Modificadores de acesso (Guia de Programação em C #)
fonte
Classe é Interna por padrão.
A interface é Interna por padrão.
Os membros da interface são públicos por padrão. (As interfaces não nos permitem especificar nenhum tipo de acessibilidade para seus membros.)
Nota: Se você tentar especificar qualquer especificador de acesso para os membros da interface, isso mostrará um erro de compilação.
Struct é Interno por padrão.
fonte
Eu gostaria de adicionar algum link de documentação. Confira mais detalhes aqui .
fonte
A resposta mais simples é a seguinte .....
Todos os membros em C # sempre usam o modificador acessível LEAST possível por padrão.
É por isso que todas as classes de nível superior em uma montagem são "internas" por padrão, o que significa que elas são públicas na montagem em que estão, mas são privadas ou excluídas do acesso a montagens externas. A única outra opção para uma classe de nível superior é pública, mais acessível. Para tipos aninhados, tudo é privado, exceto por algumas raras exceções, como membros de enumerações e interfaces que só podem ser públicas. Alguns exemplos. No caso de classes e interfaces de nível superior, os padrões são:
classe Animal igual à classe interna Animal
Interface Animal igual à interface pública Animal
No caso de classes e interfaces aninhadas (tipos internos), os padrões são:
classe Animal igual à classe privada Animal
interface Animal igual à interface privada Animal
Se você apenas assumir que o padrão é sempre o mais privado, não precisará usar um acessador até precisar alterar o padrão. Fácil.
fonte
Internal é o modificador padrão
fonte
Nível do espaço para nome:
internal
Nível do tipo:
private
fonte