Pergunta

Considerando "privado" é o modificador de acesso padrão para os membros da classe, porque é a palavra-chave, mesmo necessário?

Foi útil?

Solução

É para você (e mantenedores futuros), e não o compilador.

Outras dicas

Há uma certa quantidade de desinformação aqui:

"O modificador de acesso padrão não é privado, mas interna"

Bem, isso depende do que você está falando. Para membros de um tipo, é privado. Para próprios tipos de nível superior, é interna.

"Private é apenas o padrão para métodos em um tipo de"

Não, é o padrão para todos os membros de um tipo -. Propriedades, eventos, campos, operadores, construtores, métodos, tipos aninhados e qualquer outra coisa que eu esqueci

"Na verdade, se a classe ou struct não é declarado com um acesso modificador o padrão é interno"

Somente para os tipos de nível superior. Para tipos aninhados, é privado.

Além de restringir o acesso propriedade para uma parte, mas não a outra, o padrão é basicamente sempre "tão restritiva quanto pode ser."

Pessoalmente, eu hesitar sobre a questão de saber se a ser explícito. O "pro" para usar o padrão é que ele destaca em qualquer lugar que você está fazendo algo mais visível do que o nível mais restritivo. O "pro" para especificar explicitamente que é que é mais óbvio para aqueles que não conhecem a regra acima, e mostra que você já pensou sobre isso um pouco.

Eric Lippert vai com a forma explícita, e eu estou começando a inclinar-se dessa forma também.

http://csharpindepth.com/ViewNote.aspx?NoteID=54 para um pouco mais sobre isso.

explicitação. Eu nunca uso o padrão e sempre adicionar explicitamente o modificador.

Isto poderia ser por causa do meu background Java, onde o padrão foi 'pacote' (equivalente a 'interna' em C #) e assim a diferença sempre me incomodou. Eu encontrei explicitação ser preferível.

Eu também uso ReSharper agora qual o padrão a ser explícita, por isso só confirma e reforça o meu preconceito:)

O modificador privado explica intenção.

A variável de membro particular não se destina a manipulação direta fora da classe. se / assessores estabelecidos pode ou não ser criado para a variável.

Um método particular não se destina para uso fora da classe. Isto pode ser por apenas funcionalidade interna. Ou você poderia fazer um construtor padrão privado para impedir a construção da classe sem passar em valores.

O modificador privado (e outros como ele) pode ser uma maneira útil de escrever código de auto documentar.

Como apontado por Jon Skeet em seu livro C # In Depth , há um lugar em C #, onde a palavra-chave privada é necessária para conseguir um efeito.

Se minha memória não falha, a palavra-chave privada é a única maneira de criar uma propriedade de apanhador escopo privada ou setter, quando seu oposto tem mais de acessibilidade privado. Exemplo:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

A palavra-chave privada é necessário para conseguir isso, porque um modificador de propriedade acessibilidades adicional só pode restringir o escopo, não alargá-lo. (Caso contrário, pode ter sido capaz de criar uma propriedade privada (por padrão) e em seguida, adicione um modificador pública.)

Privada é apenas o padrão para métodos em um tipo, mas o modificador privada é usada em outros lugares.

A partir C # Language Specification 3.0 (MSDN) Seção 3.5. 1

Dependendo do contexto em que uma declaração de membro tem lugar, são permitidas apenas determinados tipos de acessibilidade declarou. Além disso, quando uma declaração de membro não inclui quaisquer modificadores de acesso, o contexto no qual a declaração ocorre determina a acessibilidade default declarado.

  • Namespaces tem implicitamente acessibilidade declarada pública. Não modificadores de acesso são permitidos em declarações de namespace.
  • Tipos declarados em unidades de compilação ou namespaces pode ter acessibilidade pública ou interna declarado e padrão a acessibilidade declarada interno.
  • Os membros da classe pode ter qualquer um dos cinco tipos de acessibilidade declarada e padrão de acessibilidade privada declarou. (Note-se que um tipo declarado como um membro de uma classe pode ter qualquer um dos cinco tipos de acessibilidade declarou, enquanto um tipo declarado como membro de um namespace pode ter acessibilidade única público ou interno declarou.)
  • membros da estrutura pode ter acesso ao público, interno ou privado declarado e padrão de acessibilidade privada declarada porque estruturas são selados de forma implícita. membros struct introduzidas em um struct (isto é, não herdado por esse struct) não pode ter protegido ou protegido acessibilidade declarou interno. (Note-se que um tipo declarado como um membro de um struct pode ter acesso ao público, interno ou privado declarou, enquanto um tipo declarado como membro de um namespace pode ter acessibilidade única público ou interno declarou.)
  • membros de interface tem implicitamente acessibilidade declarada pública. Não modificadores de acesso são permitidos em declarações de membros interface.
  • membros de enumeração tem implicitamente acessibilidade declarada pública. Não modificadores de acesso são permitidos em declarações de membros de enumeração.

Para completenes. E algumas pessoas realmente preferem ser explícito em seu código sobre os modificadores de acesso em seus métodos.

Por simetria e se conformar com estilos de codificação que, como tudo para ser explícito (pessoalmente eu gosto ...)

Usando privado sinaliza explicitamente sua intenção e deixa pistas para outros que irão apoiar o seu código;)

Alguns estilos de codificação recomendamos que você colocar todos os itens "públicos" em primeiro lugar, seguidos pelos itens "privadas". Sem uma palavra-chave "privada", você não poderia fazê-lo dessa maneira ao redor.

Update:. Eu não notar a tag "c #" neste isso a minha resposta se aplica mais para C ++ do que para C #

Eu costumo deixar de fora privado mas acho que é útil para alinhar código:

private   int    x;
public    string y;
protected float  z;

VS:

int x;

public    string y;
protected float  z;

Como Robert Paulson disse em sua resposta, o modificador private não é usado apenas sobre os membros, mas também em tipos . Isso se torna importante porque o padrão para tipos é internal que pode vazar inadvertidamente se você usar o InternalsVisibleToAttribute .

Na verdade, se a classe ou struct não é declarado com um modificador de acesso, o padrão é interna.

Então, se você quiser torná-lo privado, uso privado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top