Acceso público .net

Creo que estaba en .net 2.0, Microsoft introdujo un descriptor de acceso que se abrevia a algo como

public string Name { get; set; }

Pero, ¿hay alguna diferencia real entre el código anterior y simplemente:

 public string Name; 

La principal diferencia es que si más adelante necesita agregar lógica a su getter o setter, y ya se han comstackdo otras DLL con las suyas, puede cambiarlas fácilmente.

 public string Name { get; set; } 

dentro

 public string Name { get{/*special code*/} set{/*special code*/} } 

y no será un cambio importante publicar su nueva DLL y que no se vuelvan a comstackr otras DLL.


Mientras que si cambiaste

 public string Name; 

dentro

 public string Name { get{/*special code*/} set{/*special code*/} } 

entonces deberá asegurarse de que todos los archivos DLL que usen los suyos se vuelvan a comstackr, ya que cambian de acceso a un campo para acceder a una propiedad.

Obviamente, este es un problema mayor cuando envía archivos DLL a otros progtwigdores (como un proyecto de código abierto o un proveedor de componentes, por ejemplo) que si solo está creando una aplicación para su propio empleador / empleador.

La diferencia es entre un campo y una propiedad . Un campo es solo una variable miembro en la instancia de clase. Por el contrario, una propiedad es abreviada para dos acciones separadas: obtener y establecer:

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

Este es un ejemplo sobre simplificado, ya que la propiedad simplemente “envuelve” el campo privado devolviéndolo en el captador y configurándolo en el configurador. Sin embargo, las propiedades se vuelven muy útiles cuando se convierten en “puertas de acceso” al valor subyacente. Si el flujo del progtwig requiere que suceda algo cada vez que se establece el valor de un campo (por ejemplo, se desencadena un evento), se puede disparar desde el establecedor de la propiedad:

 set { this.InvokePropertyChangedEvent(); _name = value; } 

La syntax exacta que está preguntando se llama Propiedades de Implementación Automática , que es solo una taquigrafía para el ejemplo simple que proporcioné anteriormente. El comstackdor crea un miembro privado que la propiedad obtiene y establece.

Las propiedades automáticas se introdujeron por primera vez en C # 3.0. La diferencia entre:

 public string Name { get; set; } 

y

 public string Name; 

Es que el primero declara una propiedad mientras que el segundo un campo . En OOP las propiedades se utilizan para encapsular campos. Una propiedad puede tener un establecedor, un getter o ambos, y también puede especificar un nivel de accesibilidad diferente para cada uno.

No hay diferencia funcional en cuanto a escribir código para obtener el valor o almacenarlo. Pero hay casos en los que una persona que llama puede esperar un campo o una propiedad y solo aceptaría uno u otro utilizando la reflexión. Por ejemplo, WPF solo puede vincularse a una propiedad y no a un campo.

La diferencia entre la statement de propiedad abreviada es que puede definirla de esta manera.

 public string Name { get; private set; } 

Significa que la propiedad se puede leer públicamente pero solo los miembros privados pueden escribir en ella. No puedes hacer tal cosa por un campo.

Si observa el IL generado de las declaraciones de propiedad de mano corta, encontrará que el comstackdor ha agregado / autogenerado campos de miembros a una propiedad que leerá o escribirá.

Sí, el código en la segunda línea está haciendo que esté disponible directamente el miembro en la memoria, mientras que en la primera línea tiene un nivel de direccionamiento indirecto donde puede agregar algo de lógica en el futuro para validar y asignar de forma lenta.

Además, si usa una reflexión, tendría que buscar Property Setter y Getter para la primera línea de ejemplo y para la segunda tendría que recuperar directamente una variable miembro.

Por lo general, el uso de propiedades es mucho mejor diseño.

Una diferencia útil que encontré para los usuarios de propertygrid fue que al usar el nombre de la cadena pública {get; conjunto; } podríamos establecer los datos de origen en Propertygrid fácilmente.

mientras se declara el nombre de cadena pública; No se utilizará por completo para Propertygrid.