¿Cuál es la diferencia entre encapsular a un miembro privado como una propiedad y definir una propiedad sin un miembro privado?

¿Cuál es la diferencia (Rendimiento, memoria, etc.) entre encapsular a un miembro privado como este?

private int age; public int Age { get { return age; } set { age = value; } } 

y define una propiedad como esta

 public int Age { get ; set ; } 

El código que el comstackdor de C # genera para las propiedades implementadas automáticamente es casi idéntico al primer ejemplo (usa un campo de respaldo privado), así que no me preocuparía demasiado.

La única diferencia real es que decora el getter y setter de propiedades con el atributo [CompilerGenerated] . Esto no debería tener ningún impacto en el rendimiento de obtener y configurar la propiedad. (Como pequeño nitpick, eso debería boost el tamaño del binario del ensamblaje muy ligeramente).

Lo que me gusta de las propiedades implementadas automáticamente, aparte de la brevedad, por supuesto, es que previene que incluso el tipo declarante acceda al campo de respaldo en lugar de la propiedad (el campo de respaldo es anónimo). Esto aporta claridad al código y, en general, también facilita la refactorización / cambio de la implementación de la propiedad.

En el segundo caso, el comstackdor de C # generará un campo para usted y generará un getter y un setter para acceder a él. En otras palabras, no hay diferencia funcional entre las dos muestras de código que ha publicado. La única diferencia será el nombre del campo privado, que será generado por el comstackdor.

Hice esta pregunta hace un tiempo:

ver Uso correcto de las propiedades de C #

Citando la respuesta:

Son equivalentes en el formulario comstackdo interno, excepto que no puede acceder a la variable privada generada por el comstackdor en el segundo formulario.

Desde el punto de vista de la eficiencia del código, también son equivalentes, el comstackdor just-time normalmente accede directamente a la variable privada sin la sobrecarga de llamar a una función de acceso (después de que el entorno de ejecución haya verificado la accesibilidad, etc.).

Desde una perspectiva de encoding, prefiero la segunda versión, que es más compacta (menos para escribir, menos para leer).

La segunda syntax se introdujo en C # 3.0. Entonces, la primera variante sería más compatible con los viejos comstackdores.

La diferencia es que tienes control sobre los getters y setters.

Con la implementación automática, no puedes hacer algo como:

 private int age; public int Age { get { return age; } set { if (age != value) { age = value; OnAgeChanged(EventArgs.Empty); } } } public event EventHandler AgeChanged; protected virtual void OnAgeChanged(EventArgs e) { var handler = AgeChanged; if (handler != null) handler(this, e); } 

Si no necesita esto, la implementación automática debería ser suficiente.

La principal ventaja con respecto al uso de una implementación de propiedad automática en comparación con un campo es que cuando utiliza una implementación de propiedad automática y luego desea cambiar la implementación en, por ejemplo, lo anterior, la interfaz de su clase no cambia.

ninguna diferencia en comparación con el rendimiento en el segundo caso es azúcar sintética para escribir propiedades llamadas Propiedades automáticas.

si quiere poner algo de lógica en el conjunto o obtener parte, no podrá hacer las propiedades automáticas.