Alguma razão para escrever a palavra-chave “privada” em C #?

109

Tanto quanto eu sei, privateé o padrão em todos os lugares em C # (o que significa que se eu não escrevo public, protected, internal, etc. será privatepor padrão). (Por favor corrija-me se eu estiver errado.)

Então, qual é a razão para escrever essa palavra-chave, ou por que ela existe para os membros?

Por exemplo, quando um manipulador de eventos é gerado automaticamente, tem a seguinte aparência:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Mas por que ele escreve privado se isso está implícito e padrão? Só para que os desenvolvedores novatos (que não sabem que é o padrão C #) saibam que é privado? Ou existe alguma diferença para o compilador?

Além disso, há um caso em que a escrita "private" (sozinho) vai mudar a acessibilidade do usuário?

Camilo Martin
fonte
18
IIRC, um tipo de "nível superior" será internal, entretanto, por padrão.
Jeff Mercado
4
O padrão para tudo não é privado, conforme indicado, e como regra geral, é melhor ser explícito.
James Michael Hare
1
Relacionado: C # precisa da palavra-chave privada?
BoltClock
O padrão para tudo é "o mais privado possível". Obviamente, uma classe não aninhada não pode ser privada, ou nada poderia instanciar ou usá-la. Mas os membros são privados por padrão e as classes aninhadas são privadas por padrão. Tudo em C # tem, por padrão, o nível mais restrito de visibilidade que pode ter.
Ryan Lundy

Respostas:

171

AFAIK, privado é o padrão em todos os lugares em C # (o que significa que se eu não escrever público, protegido, interno, etc., será privado por padrão). (corrija-me se estiver errado).

Isso não é verdade. Os tipos definidos em um namespace (classes, estruturas, interfaces, etc) serão internos por padrão. Além disso, membros de diferentes tipos têm diferentes acessibilidades padrão (como público para membros de interface). Para obter detalhes, consulte Níveis de acessibilidade no MSDN.

Além disso,

Então, qual é a razão para escrever essa palavra-chave, ou por que ela existe?

Especificar isso explicitamente ajuda a denotar sua intenção de tornar o tipo privado, muito explicitamente. Isso ajuda na manutenção do seu código ao longo do tempo. Isso pode ajudar com outros desenvolvedores (ou você) sabendo se um membro é privado por padrão ou propositalmente, etc.

Reed Copsey
fonte
1
@Wayne: ele tem uma resposta com pontuação maior do que Jon Skeet, mas não merece ... A resposta de Jon é muito mais precisa.
aleroot
2
Esta é uma distinção inútil. Os tipos dentro de um namespace são internos por padrão porque não podem ser privados por padrão; caso contrário, nada poderia usá-los. Eles ainda são tão restritos quanto podem ser, por padrão.
Ryan Lundy
1
A acessibilidade dos membros padrão para classes e estruturas inisde é privada. Verifique aqui: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca
Mas os elementos dentro de um namespace não podem ser private.
Shimmy Weitzhandler
Além disso, gete setpadrão para a acessibilidade da própria propriedade
AustinWBryan,
119

AFAIK, privado é o padrão em todos os lugares em C #

Não exatamente - o padrão é "o acesso mais restrito disponível para esta declaração". Portanto, por exemplo, com um tipo de nível superior, o padrão é internal; para um tipo aninhado, o padrão é private.

Então, qual é a razão para escrever essa palavra-chave, ou por que ela existe?

Torna-o explícito, o que é bom por dois motivos:

  • Deixa mais claro para quem não conhece os padrões, conforme sua pergunta (nunca gostei desse argumento, pessoalmente, mas achei que vale a pena mencioná-lo)
  • Dá a impressão de que você decidiu deliberadamente torná-lo privado, em vez de apenas seguir os padrões.

Quanto à sua última parte:

Além disso, há um caso em que escrever "privado" (sozinho) mudará a acessibilidade do membro?

Sim, por tornar metade de uma propriedade mais restritiva que a outra:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Eu costumava usar os padrões em todos os lugares que podia, mas estou convencido (em parte por Eric Lippert) de que deixar claro que você pensou sobre isso e decidiu tornar algo privado é uma boa ideia.

Pessoalmente, eu gostaria que houvesse uma maneira de fazer isso por selado / sem lacre, também, para declarações de tipo - possivelmente nem sequer têm um padrão. Suspeito que muitos desenvolvedores (inclusive eu, se não for cuidadoso) deixam as classes sem lacre apenas porque é menos trabalhoso do que selá-las.

Jon Skeet
fonte
+1. Usar palavras-chave irrelevantes para sinalizar a intenção semântica é útil, embora minha experiência em Java faça o uso de finalum exemplo mais típico.
jprete
1
@minitech: O contrário também funciona, mas é menos útil. Tudo isso foi introduzido em C # 2.
Jon Skeet
20
Eu certamente gostaria que não houvesse nenhum padrão e que o compilador apenas emitisse um erro se o modificador de acesso estivesse faltando. Não acho que a maioria das pessoas saiba quais são os padrões para cada situação, o que leva a erros não intencionais.
+1 "para um tipo aninhado, o padrão é privado" - só fiquei sabendo disso quando li sua resposta. Obrigado!
Nordin
5
@Phong, para C # há uma regra fácil: por padrão, tudo é tão privado quanto pode ser. Os itens em um namespace, como classes não aninhadas, não podem ser privados, porque nada poderia usá-los. Eles só podem ser internos ou públicos; então, por padrão, eles são internos. Coisas dentro de outras coisas (enums dentro de uma classe; classes aninhadas; propriedades; campos; métodos ...) são privadas por padrão.
Ryan Lundy
11

privateadiciona desordem visual. Para aqueles que insistem que torna as coisas explícitas, eu perguntaria: Você também faz isso com a matemática? Por exemplo:

var answer = a + b / c;

Você acha que isso não está claro sem parênteses redundantes ao redor b / c ?

A regra em C # é muito simples: por padrão, tudo é o mais privado possível. Portanto, se você precisa que algo seja mais visível do que o padrão, adicione um modificador. Caso contrário, não adicione palavras-chave desnecessárias ao seu código.

Ryan Lundy
fonte
1
Eu costumava concordar com esse direito antes de fazer a pergunta. Mas, algumas pessoas escrevem VB, alguns C ++, alguns até F # (vindo de outras linguagens funcionais como Haskell talvez?), Melhor do que em C #. Então, para eles (e para nós, se esquecermos disso após 2 anos sem c # ing) é melhor que os acessores sejam explícitos. Não subestime o impacto que a aprendizagem fácil tem em um projeto, muitos desenvolvedores vêm de experiências que podem não refletir a ferramenta de escolha, e eles precisam de ajudas de aprendizagem, mesmo em código de produção, isso não é ruim (e conhecemos muitos código C # muito ruim, então algumas ajudas nos ajudam também).
Camilo Martin
3
Bem, com certeza, em VB os padrões são atrozes. Acho que a visibilidade padrão é Friendpara membros, por exemplo. C # faz seus padrões de visibilidade da maneira certa: as coisas são definidas com a menor visibilidade possível, a menos que sejam alteradas. Pelo que consegui descobrir, parece que o mesmo vale para C ++ (exceto structs). (Não parece ser verdade para F #.)
Ryan Lundy
6
É estranho para mim que tantas pessoas sejam a favor do var, porque ele reduz a desordem visual, e ainda assim tantas pessoas sejam a favor da digitação desnecessária private.
Ryan Lundy
2
Eu chegaria ao ponto de argumentar que a desordem visual inibe a legibilidade!
binki de
1
upvoted mesmo que eu não preferem usar parênteses, no caso do seu exemplo de matemática.
Marc.2377
7

Pelo que eu sei, privado é o padrão em todos os lugares em C #

Declarar explicitamente privado significa que você sabe que é privado. Não apenas pense que é, porque até onde você sabe, é o padrão. Também significa que outra pessoa que olha o código sabe o que é.

Não existe "eu acho que é", "Eu tenho certeza que ele é", etc. Isso só é . E todos estão na mesma página.

eu não sou um desenvolvedor C # . Se eu tivesse que trabalhar com algum código que não foi declarado explicitamente privado , provavelmente assumiria que era interno .

Não gosto quando as coisas estão implicitamente definidas. Nunca é tão claro como quando eles são definidos explicitamente.

JD Isaacks
fonte
Parece razoável, até esqueço noções básicas de línguas que conheci melhor.
Camilo Martin
6

Legibilidade - nem todo mundo sabe que privado é o comportamento padrão.

Intenção - dá uma indicação clara de que você declarou especificamente a propriedade privada (por qualquer motivo).

James
fonte
5

Legibilidade e demonstração de intenção são duas grandes razões que posso imaginar.

Maess
fonte
Acordado. Por exemplo, se você estiver trabalhando com outros desenvolvedores em um pouco de código, definir algo como privado ajuda a indicar sua intenção. Também é útil quando você volta para o seu código depois de alguns anos e seu IDE pode dizer quais métodos devem ser publicamente acessíveis para aquela classe.
Aaron Newton
3

Um bom motivo para especificar explicitamente a visibilidade é para que você não precise pensar sobre qual é o padrão para o contexto em que está.

Outra boa razão é porque o FxCop diz para você fazer isso.

Patrick McDonald
fonte
1, acabei de notar sobre FxCop reclamando sobre mim removendo o modificador privado agora quando eu construí com a mudança.
Camilo Martin
2

Muitas pessoas (como eu!) Programam regularmente em vários idiomas diferentes. Ser explícito com coisas como essas me impede de precisar me lembrar de todos os detalhes misteriosos de todas as linguagens que eu programo.

davidtbernal
fonte
1
Bem, eu não diria que "o modificador de acesso padrão é private" é um detalhe misterioso ... Mas eu entendo o ponto. Outro dia tive dificuldade em lembrar como funcionava a estrutura que usei na semana passada ( MEF ).
Camilo Martin
0

Eu diria para consistência com a legibilidade do escopo do resto da classe.

MGZero
fonte
4
Você está pensando em C ++. Em C #, mesmo em estruturas, os membros são padronizados como privados.
3
As estruturas não têm acessibilidade pública por padrão - consulte: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey