Pergunta

Eu sou um muito novo C # e desenvolvedor .Net. Eu recentemente criado um snap-in MMC usando C # e foi gratificada com como era fácil de fazer, especialmente depois de ouvir um monte de histórias de horror por alguns outros desenvolvedores na minha organização sobre o quão difícil é fazer em C ++.

Eu praticamente passou por todo o projeto em algum momento e fez todas as instâncias da palavra-chave "pública" para "interno", exceto conforme exigido pelo tempo de execução, a fim de executar o snap-in. Qual é o seu sentimento sobre isso, geralmente você deve fazer classes e métodos pública ou interna?

Foi útil?

Solução

Eu acredito em BlackBoxes sempre que possível. Como um programador, eu quero uma caixa preta bem definida que eu posso facilmente cair em meus sistemas, e tê-lo trabalho. Dou-lhe valores, chamar os métodos apropriados, e em seguida, obter os meus resultados voltar com isso.

Para o efeito, dá-me apenas a funcionalidade que as necessidades de classe para expor ao trabalho.

Considere um elevador. Para obtê-lo para ir a um chão, eu apertar um botão. Essa é a interface pública para a caixa preta que ativa todas as funções necessárias para obter o elevador para o andar desejado.

Outras dicas

O que você fez é exatamente o que você deve fazer; dar suas aulas a visibilidade mais mínimo possível. Heck, se você quiser realmente ir porco inteiro, você pode fazer tudo internal (no máximo) e usar o atributo InternalsVisibleTo , de modo que você pode separar sua funcionalidade, mas ainda não expô-la para o mundo exterior desconhecida.

A única razão para fazer as coisas público é que você está empacotando seu projeto em diversas DLLs e / ou EXEs e (por qualquer motivo) você não se importa com o uso InternalsVisibleTo, ou você está criando uma biblioteca para uso por terceiros. Mas mesmo em uma biblioteca para uso por terceiros, você deve tentar reduzir a "área de superfície" sempre que possível; os mais classes que você tem disponível, mais confundindo sua biblioteca será.

Em C #, forma uma boa para garantir que você está usando a visibilidade mínima possível é a de deixar de fora os modificadores de visibilidade até que você precisa deles. Tudo em C # padrão é a menor visibilidade possível: interna para as aulas, e privado para os membros da classe e classes internas

.

Eu acho que você deve errar no lado de classes internas e membros. Você sempre pode aumentar a visibilidade de um item, mas diminuí-la pode causar problemas. Isto é especialmente verdadeiro se você está construindo um quadro para os outros.

Você precisa ter cuidado para não esconder funcionalidade útil de seus usuários. Existem muitos métodos úteis no .NET BCL que não podem ser usados ??sem recorrer à reflexão. No entanto, escondendo-se estes métodos a área de superfície do que tem de ser testado e mantido é reduzida.

Eu prefiro evitar marcação classes como public menos que eu queira explicitamente o meu cliente para consumi-los, e eu estou preparado para apoiá-los.

Em vez de marcar uma classe como internal, deixo o espaço em branco acessibilidade. Desta forma, public se destaca aos olhos como algo notável. (A exceção, é claro, é classes aninhadas, que têm de ser marcado, se quiserem ser ainda visível no mesmo conjunto.)

A maioria das classes deve ser internal, mas a maioria dos membros não-privadas devem ser public.

A pergunta que você deve perguntar sobre um membro é "se a classe foram feitas public que eu iria querer membro do membro a ser exposto?". A resposta é geralmente "sim (assim public)" porque classes sem quaisquer membros acessíveis não são muito uso! membros internal têm um papel; eles são 'o acesso back-door' significava apenas para parentes próximos que vivem no mesmo conjunto.

Mesmo se sua classe permanece interno, é bom ver que são membros da porta da frente e que são back-door. E se você mudar para público você não vai ter que ir para trás e pensar sobre qual é qual.

Você deve tendem a expor o mínimo possível a outras classes, e pensar cuidadosamente sobre o que você expor e porquê.

Existe alguma razão que você precisa para uso interno em vez de privado? Você percebe que Interno tem escopo montagem de nível. Em outras palavras classes internas / membros são acessíveis a todas as classes em um multi-classe de montagem.

Como algumas outras respostas já disse, no movimento geral para o mais alto nível de encapsulamento possível (ou seja, privada), a menos que você realmente precisa / protegido / público interno.

Eu encontrei um problema usando classes internas , tanto quanto possível. Você não pode ter métodos, propriedades, campos, etc desse tipo (ou tipo de parâmetro ou tipo de retorno) mais visível do que interno. Isto leva a ter construtores que são internos, bem como propriedades. Isso não deve ser um problema, mas como uma questão de fato, quando usando o Visual Studio eo designer XAML, há problemas. erros falsos positivos são detectados pelo designer devido ao fato de que os métodos não são públicos, propriedades de controle de usuário não parece visível para o designer. Eu não sei se os outros já caíram sobre essas questões ...

Você deve tentar fazer-lhes apenas o mais visível possível, mas como afirma Mike acima, isso causa problemas com UserControls e usando o Designer VS com esses controles em formulários ou outros UserControls.

Assim, como regra geral, mantenha todas as classes e UserControls que você Arent adicionando usando o Designer apenas como visível como eles precisam ser. Buf que você está criando um UserControl que deseja usar no Designer (Mesmo se isso é dentro do mesmo assembly), você precisa ter certeza de que a classe UserControl, o construtor padrão e quaisquer propriedades e eventos são divulgados para o designer para trabalhar com ele.

Eu tive um problema recentemente onde o designer iria manter a remoção do this.myControl = new MyControl () linha do método InitializeComponent () porque o UserControl MyControl foi marcado como interno junto com seu construtor.

Sua realmente um bug Acho que é porque, mesmo se eles são marcados como internos eles ainda aparecem na caixa de ferramentas para adicionar no Designer, o Microsoft precisa mostrar apenas controles públicos com construtores públicos, ou que eles precisam para fazer o trabalho com controles internos também.

Depende de quanto controle você tem sobre o código que consome. Em meu desenvolvimento Java, faço todas as minhas coisas public final por padrão porque getters são irritantes. No entanto, eu também tenho o luxo de ser capaz de mudar nada na minha base de código quando eu quiser. No passado, quando eu tive que código de liberação para os consumidores, Eu sempre usei variáveis ??privadas e getters.

Não escolha um "default" escolher o que melhor se adapta às necessidades de visibilidade para essa classe particular. Quando você escolhe uma nova classe no Visual Studio, o modelo é criado como:

class Class1
{
}

O que é privado (uma vez que nenhum escopo é especificado). Cabe a você para especificar escopo para a classe (ou deixar como privado). Deve haver uma razão para expor a classe.

Eu gosto de expor coisas tão pouco quanto possível. Privado, protegido, internos, público:. Aulas dá, variáveis, propriedades e funções a menor quantidade de visibilidade que eles precisam para que tudo ainda trabalho

Eu vou bater visibilidade do algo que cadeia para público apenas quando há uma boa razão para isso.

Eu discordo completamente com as respostas até agora. Eu sinto que interna é uma idéia horrível, impedindo outra montagem de herdar seus tipos, ou mesmo usando seus tipos internos devem a necessidade de uma solução alternativa acontecer.

Hoje, eu tive que usar a reflexão, a fim de obter para os internos de um System.Data.DataTable (Eu tenho que construir um relâmpago tabela de dados rápido, sem todos os seus cheques), e eu tive que usar a reflexão, uma vez que não um único tipo estava disponível para mim; Todos ficaram marcados como interno.

por classe padrão é criado como interna em c #: meios internos:. O acesso é limitado ao conjunto atual

ver http://msdn.microsoft.com/en-us/library/0b0thckt.aspx

Boa artigo alcance os padrões é interno: http: //www.c-sharpcorner. com / UploadFile / 84c85b / default-scope of-aC-Sharp-classe /

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