Aquí hay algunos argumentos para las propiedades y mis contraargumentos:
Más fácil de usar que escribir métodos getter y setter
Los pares de métodos getter y setter son un olor a código. Hacer que sea más fácil escribir esto es como hacer que sea más fácil reprobar una prueba de matemáticas usando un formulario Scantron y completando todas las 'C'. Los objetos que contienen solo estado, para persistencia, no deberían usar getters / setters y deberían crear objetos inmutables en el momento de la persistencia.
Lo que es importante para un consumidor de un objeto es lo que hace, no cómo lo hace. Su comportamiento es lo que hace; su estado es como lo hace. Si te preocupa el estado de un objeto (excepto por la persistencia, aunque esto también rompe OO), simplemente no estás haciendo POO y perdiendo sus ventajas.
Dan una indicación aproximada del rendimiento a los consumidores.
Esto es algo que podría cambiar en el futuro, para cualquier propiedad dada. Supongamos que en la versión 1.0, acceder a PropertyX simplemente devuelve un campo. En la versión 1.5, si el campo es nulo, PropertyX usa el patrón de objeto nulo para crear un nuevo objeto nulo. En la versión 2.0, el campo se está validando aún más por el método getter en PropertyX.
A medida que la propiedad se vuelve más y más compleja, la indicación de rendimiento del uso de una propiedad parece cada vez menos veraz.
Son mejores que los campos públicos
Esto es verdad. Pero también lo son los métodos.
Representan un aspecto fundamentalmente diferente de un objeto que un método, y todos los consumidores del objeto deberían preocuparse por esto.
¿Estás seguro de que las dos afirmaciones anteriores son ciertas?
Son más fáciles de escribir, hombre
Claro, escribir myObject.Lengthes más fácil que escribir myObject.Length(), pero ¿no podría solucionarse con un poco de azúcar sintáctica?
¿Por qué usar métodos en lugar de propiedades?
Sin garantías de rendimiento. La API seguirá siendo veraz incluso si el método se vuelve más complejo. El consumidor deberá perfilar su código si se encuentra con problemas de rendimiento y no depender de la palabra de API.
Menos para que el consumidor piense. ¿Esta propiedad tiene un setter? Un método seguro no lo hace.
El consumidor está pensando desde una mentalidad OOP adecuada. Como consumidor de una API, estoy interesado en interactuar con el comportamiento de un objeto. Cuando veo propiedades en la API, se parece mucho al estado. De hecho, si las propiedades hacen demasiado, ni siquiera deberían ser propiedades, por lo que, en realidad, las propiedades en un estado API SON tal como aparecen para los consumidores.
El programador de la API pensará más profundamente sobre los métodos con valores de retorno, y evitará modificar el estado del objeto en dichos métodos, si es posible. La separación de los comandos de las consultas debe aplicarse siempre que sea posible.
Entonces te pregunto, ¿por qué usar propiedades en lugar de métodos? La mayoría de los puntos en MSDN son olores de código en sí mismos y no pertenecen ni a propiedades ni a métodos.
(Estos pensamientos me vinieron después de pensar en CQS).
type GetFoo() void SetFoo()diez mil veces. En todo mi tiempo escribiendo código C #, nunca me ha confundido una propiedad.