Pergunta

Em C# você pode criar getter/setters de uma forma mais simples do que outras línguas:

public int FooBar { get; set; }

Isso cria um privado interno variável que você não pode dirigir-se directamente, com a propriedade externa 'FooBar' para acessá-lo diretamente.

A minha pergunta é - como muitas vezes você vê esse abuso?Parece que ele tem um alto potencial para violar o encapsulamento de melhores práticas, muitas vezes.Não me interpretem mal, eu uso ele como apropriado, e parcial variações do mesmo, para somente leitura somente leitura tipos de propriedades, mas quais são as suas experiências desagradáveis com ele a partir de outros autores em sua base de código?

Esclarecimento:a intenção definição de abuso seria de fato a criação de uma propriedade particular variáveis são apropriados.

Foi útil?

Solução

Eu já vi isso abusado (na minha opinião).Em particular, quando o desenvolvedor normalmente gravação:

private readonly int foo;
public int Foo
{ 
    get 
    { 
        return foo;
    }
}

eles, por vezes, vou escrever:

public int Foo { get; private set; }

Sim, é mais curto.Sim, de fora a classe tem a mesma aparência, mas eu não ver estes como a mesma coisa, como a segunda forma permite que a propriedade a ser definida em outro lugar na mesma classe.Isso também significa que não há nenhum aviso, se a propriedade não está definido no construtor, e o campo não é só de leitura para a CLR.Estas são diferenças sutis, mas acabou indo para o segundo formulário, porque é mais simples e ignorando as diferenças se sente como abuso para mim, mesmo se ele for menor.

Felizmente, este é agora disponível a partir do C# 6:

// Foo can only be set in the constructor, which corresponds to a direct field set
public int Foo { get; }

Outras dicas

Não há "abuso", simplesmente por não escrever o campo manualmente;e é bom para incentivar a todos o acesso através da propriedade (e não diretamente para o campo) de qualquer maneira!

O maior problema que eu conheço é com a serialização binária, onde fica um pouco complicado para voltar a mudar para um campo regular, sem fazer dela versão incompatível - mas então...usar um diferente serializador ;-p

Seria bom se houvesse um "bom" só de leitura variante, e se você não precisa usar :this() construtor-encadeamento em estruturas, mas....meh!

Eu não vi nenhum abuso dele.E para ser honesto, eu realmente não vejo o que você quer dizer, como eu não consigo ver como essa sintaxe pode ser abusado.

Eu não acho propriedades automáticas são pior do que regular propriedades no que diz respeito ao encapsulamento.

Se você quer dizer que alguns desenvolvedores usam público propriedades automáticas em vez disso campos privados, em seguida, é claro que isto é errado e quebra de encapsulamento..

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