Pergunta

Alguém já viu pessoas fazem isso:

private string _name;
public string Name{ get{ return _name; } set{ _name = value;}}

Eu entendo usando acessores se você estiver indo para exercer algum tipo de controle sobre como ele começa o jogo ou realizar algum tipo de função nele quando há um get. Mas se você está indo só para fazer isso, porque não basta fazer o público variável para começar? Estou faltando alguma coisa?

Foi útil?

Solução

Se você fizer o membro um campo público, então você não pode depois refatorar-lo em uma propriedade sem alterar a interface para sua classe. Se você expô-la como uma propriedade desde o início, você pode fazer todas as alterações à propriedade acessador funções que você precisa e interface do classe permanece inalterada.

Note que a partir de C # 3.0, você pode implementar uma propriedade sem a criação de um campo de apoio, por exemplo:.

public string Name { get; set; }

Isso remove o que é praticamente a única justificação para a não implementação de campos públicos como propriedades em primeiro lugar.

Outras dicas

Se você definir uma interface pública com um imóvel em conjunto A, você poderia, então, usar essa interface na montagem B.

Agora, você pode alterar a implementação da propriedade (talvez buscar o valor de um banco de dados em vez de armazená-lo em um campo). Depois, você pode recompilar assembly A, e substituir um mais antigo. Assembly B continuaria muito bem porque a interface não teria mudado.

No entanto, se você tivesse começou inicialmente com um campo público, e decidiu que não era adequado e queria alterar a implementação e para isso você precisava para convertê-lo para uma propriedade, então isso significaria que seria tem que mudar a montagem interface pública de um. Todos os clientes de que a interface (incluindo montagem B) também teria que ser recompilados e substituído para ser capaz de trabalhar com esta nova interface.

Assim, você é melhor começar com uma propriedade inicialmente. Este encapsula a implementação da propriedade, deixando-o livre para mudá-lo no futuro, sem ter que se preocupar o que os clientes (incluindo montagem B) já estão fora do mundo usando a montagem A. Porque, se existem clientes já fora no mundo fazendo uso de montagem a, alterar a interface iria quebrar todos os clientes. Se eles são usados ??por outra equipe em sua empresa, ou outra empresa, então eles estão indo para não ser feliz se você quebrar suas assembléias, alterando a interface de vocês!

A idéia é que se você usar acessores, a implementação subjacente pode ser alterado sem alterar a API. Por exemplo, se você decidir que quando você definir o nome, você também precisa atualizar uma caixa de texto, ou outra variável, nenhum de seu código de cliente teria que mudar.

Pode ser interessante notar que DataBinding no .NET também se recusa a trabalhar off campos públicos e propriedades demandas. De modo que pode ser outra razão.

A boa prática de programação. Este é um padrão muito comum que se encaixa com metodologias de projeto OO. Ao expor um campo público você expõe os detalhes internos de como os dados estão sendo armazenados. Usando uma propriedade pública em vez permite-lhe mais flexibilidade para mudar a forma como os dados são armazenados internamente e não quebrar a interface pública. Ele também permite que você mais controle sobre o que acontece quando os dados são acessados ??(inicialização lenta, verificações nulos, etc.)

As variáveis ??são parte da implementação de uma classe. Propriedades representam mais logicamente a interface para isso. Com C # 3.0, Propriedades implementadas automaticamente tornar esta uma brisa para fazer desde o início.

Eu tenho escrito mais pensamentos sobre este assunto, incluindo as várias maneiras em que a mudança de uma variável a uma propriedade breaks não apenas compatibilidade binária, mas também de compatibilidade fonte, um artigo sobre o tema .

Preparação. Você nunca sabe quando você vai querer remover o conjunto de assessor na estrada, realizar operações adicionais no setter, ou alterar a fonte de dados para o get.

Publicamente membros acessíveis devem ser tipicamente métodos e não de campos. É apenas boas práticas, e que a prática ajuda a garantir que o estado encapsulada de seus objetos é sempre sob seu controle.

Para encapsulamento, não é recomendado o uso de campos públicos.

http://my.safaribooksonline.com/9780321578815/ch05lev1sec5?displaygrbooks=0

Como Chris Anderson disse mais tarde neste livro, seria ideal seria se o chamador estavam cegos para a diferença de propriedade de campo vs..

Para manter um alto grau de extensibilidade sem a dor de compilação re-todas as suas montagens, você quer usar propriedades públicas, como assessores. Seguindo um "contrato" ou um mecanismo definido que descreve como seus objetos vão trocar dados de um conjunto de regras serão postas em prática. Este contrato é aplicada com uma interface e cumprido pelos getters e setters da sua classe que herda dessa interface.

Mais tarde, você deve criar classes adicionais a partir dessa interface, você tem a flexibilidade de aderir ao contrato com o uso das propriedades, mas desde que você está fornecendo os dados via os getters e setters, a implementação ou processo de montagem de dados lata qualquer coisa que você quiser, como ao longo como ele retorna o tipo que o "contrato" espera.

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