Aqui estão alguns argumentos para propriedades e meus contra-argumentos:
Mais fácil de usar do que escrever métodos getter e setter
Os pares de métodos getter e setter são cheiros de código. Tornar mais fácil escrever isso é como tornar mais fácil a reprovação em um teste de matemática usando um formulário Scantron e preenchendo todos os 'C'. Objetos que contêm apenas estado, por persistência, não devem usar getters / setters e devem criar objetos imutáveis no momento da persistência.
O que é importante para um consumidor de um objeto é o que ele faz, não como ele faz. Seu comportamento é o que faz; seu estado é como ele faz isso. Se você se preocupa com o estado de um objeto (exceto pela persistência, embora isso também interrompa o OO), você simplesmente não está fazendo POO e perdendo suas vantagens.
Eles fornecem uma indicação aproximada do desempenho para os consumidores
Isso é algo que pode mudar no futuro, para qualquer propriedade. Suponha que na versão 1.0, acessar o PropertyX simplesmente retorne um campo. Na liberação 1.5, se o campo for nulo, o PropertyX usa o padrão Objeto Nulo para criar um novo objeto nulo. Na versão 2.0, o campo está sendo validado ainda mais pelo método getter no PropertyX.
À medida que a propriedade se torna cada vez mais complexa, a indicação de desempenho do uso de uma propriedade parece cada vez menos verdadeira.
Eles são melhores que os campos públicos
Isso é verdade. Mas o mesmo acontece com os métodos.
Eles representam um aspecto fundamentalmente diferente de um objeto que um método, e todos os consumidores do objeto devem se preocupar com isso.
Tem certeza de que ambas as afirmações acima são verdadeiras?
Eles são mais fáceis de digitar, cara
Claro, digitar myObject.Lengthé mais fácil do que digitar myObject.Length(), mas isso não poderia ser corrigido com um pouco de açúcar sintático?
Por que usar métodos em vez de propriedades?
Sem garantias de desempenho. A API permanecerá verdadeira, mesmo que o método fique mais complexo. O consumidor precisará criar um perfil de seu código se estiver enfrentando problemas de desempenho e não confiar na palavra da API.
Menos para o consumidor pensar. Esta propriedade possui um setter? Um método certamente não.
O consumidor está pensando a partir de uma mentalidade OOP adequada. Como consumidor de uma API, estou interessado em interagir com o comportamento de um objeto. Quando vejo propriedades na API, ela se parece muito com o estado. De fato, se as propriedades fizerem muito, elas nem deveriam ser propriedades; na verdade, as propriedades em uma API SÃO como elas aparecem para os consumidores.
O programador da API pensará mais profundamente sobre métodos com valores de retorno e evitará modificar o estado do objeto nesses métodos, se possível. A separação de comandos das consultas deve ser aplicada sempre que possível.
Então, pergunto: por que usar propriedades em vez de métodos? A maioria dos pontos no MSDN são odores de código por si só e não pertencem a propriedades ou métodos.
(Esses pensamentos vieram a mim depois de pensar no CQS.)
type GetFoo() void SetFoo()dez mil vezes. Durante todo o meu tempo escrevendo código C #, nunca fui confundido com uma propriedade.