Por qué necesitamos propiedades en C #

¿Me puede decir cuál es el uso exacto de las propiedades en C #? Me refiero a la explicación práctica

en nuestro proyecto estamos usando propiedades como

///  /// column order ///  protected int m_order; ///  /// Get/Set column order ///  public int Order { get { return m_order; } set { m_order = value; } } ///  /// constructor ///  /// column name /// column width /// column order public ViewColumn(string name, int width, int order) { // // TODO: Add constructor logic here // m_name = name; m_width = width; m_order = order; } ///  /// returns the column name, width, and order in list view. ///  /// string represent of the ViewColumn object public override string ToString() { return (string.Format("column name = {0}, width = {1}, order = {2}.", m_name, m_width, m_order)); } ///  /// Do a comparison of 2 ViewColumn object to see if they're identical. ///  /// ViewColumn object for comparison /// True if the objects are identical, False otherwise. public override bool Equals(object obj) { ViewColumn vc = (ViewColumn)obj; if(m_name == vc.Name && m_width == vc.Width && m_order == vc.Order) return true; else return false; } 

Piénselo: tiene una habitación y una puerta para entrar a esta habitación. Si desea comprobar cómo va a entrar y asegurar su habitación, entonces debe usar las propiedades, de lo contrario no serán ninguna puerta y cada uno entrará fácilmente sin ninguna regulación.

 class Room { public string sectionOne; public string sectionTwo; } Room r = new Room(); r.sectionOne = "enter"; 

La gente está entrando en la sección Uno bastante fácil, no hubo ninguna verificación.

 class Room { private string sectionOne; private string sectionTwo; public string SectionOne { get { return sectionOne; } set { sectionOne = Check(value); } } } Room r = new Room(); r.SectionOne = "enter"; 

ahora usted revisó a la persona y sabe si tiene algo malo con él.

Respuesta corta: encapsulación

Respuesta larga: las propiedades son muy versátiles. Le permite elegir cómo desea exponer sus datos a objetos externos. Puede inyectar cierta cantidad de validación de datos al establecer valores. También alivia el dolor de cabeza de los getX() y setX() vistos en los gustos de Java, etc.

Muchas razones:

  • Semántica. Las propiedades separan la implementación de su tipo de la interfaz.
  • Compatibilidad binaria Si alguna vez necesita cambiar una propiedad, puede hacerlo sin romper la compatibilidad binaria para el código dependiente. Con los campos, debe volver a comstackr todo, incluso si la nueva implementación utiliza una propiedad con el mismo nombre.
  • El enlace de datos. No puedes enlazar datos a un campo.

Aquí hay un patrón común:

 class Foo { private Bar _bar; //here, Foo has a Bar object. If that object has already been instantiated, return that value. Otherwise, get it from the database. public Bar bar { set { _bar = value;} get { if (_bar == null) { _bar = Bar.find_by_foo_name(this._name); } return _bar; } } } 

En resumen, esto nos permite acceder al objeto Bar en nuestra instancia de Foo. Esta encapsulación significa que no tenemos que preocuparnos de cómo se recupera Bar, o si ya se ha instanciado foo.bar. Solo podemos usar el objeto y dejar que los internos de la clase Foo se encarguen de eso.

Esa es la forma de usarlo, excepto por la forma en que lo estás configurando, posiblemente. En lugar de acceder a la variable miembro, es posible que desee utilizar la propiedad desde dentro de la clase, por lo que puede usar reglas uniformes con respecto a cada variable miembro. Esta es la principal ventaja de usar propiedades, es llevar la lógica de acceso y del setter a un solo lugar. Realmente depende de sus necesidades específicas ya sea que quiera o no configurarlo usando la propiedad o no. Sin embargo, tenga en cuenta que en el constructor debe tener mucho cuidado al llamar a la propiedad, ya que puede o no depender de otras partes de la clase inicializada, lo que no se haría aún si se accede a través del constructor. De nuevo, esto depende de su implementación específica.

También es un poco más limpio de usar:

 myObject.Property1 = "Test String"; Console.WriteLine(myObject.Property1); 

Que lo que ves en algunos otros idiomas:

 myObject.setProperty1("Test String"); System.out.writeln(myObject.getProperty1()); 

Aquí hay un caso en el que puede encapsular cierta lógica:

 public int Order { get { return m_order; } set { // Put some rules checking here. Maybe a call to make sure that the order isn't duplicated or some other error based on your business rules. m_order = value; } } 

Otra forma en que son útiles sería así:

 public int Order { get; private set; } 

Y ahora tiene una propiedad implementada automáticamente con una variable de miembro de respaldo que solo se puede configurar dentro de la clase pero leer en cualquier otro lado.

Finalmente, si necesita controlar la lógica, puede escribir esto:

 public int Order { get { return m_order; } protected set { // Again, you can do some checking here if you want... m_order = value; // You can also do other updates if necessary. Perhaps a database update... } } 

Las propiedades se utilizan para restringir el acceso directo a las variables miembro de una clase. La abstracción se mantiene usando propiedades. Siempre que desee instanciar un objeto y establecer datos en sus variables miembro usando propiedad, puede verificar algunas condiciones, ya sea que el valor se establezca en la variable miembro o no. Puede restringir la escritura de lectura a una propiedad para que el valor de la variable miembro pueda ser de solo lectura, solo escritura mientras se accede al objeto de esa clase.

Beneficios de tiempo de diseño

Propiedades hace que el diseño visual sea más fácil, tiene el explorador de propiedades más famoso de Visual Studio para permitirle cambiar las propiedades del objeto.

Las propiedades también proporcionan metadatos adicionales de validación, apariencia visual dentro del Explorador de propiedades, como menú desplegable, rango, selector de color, etc.

Separar datos y acciones

Representan realmente la diferencia entre “Datos” de objeto y “Acciones” (Métodos) de objeto.

Cuando miramos la clase, si tenemos 50 métodos para mirar, no todos usarán siempre el nombre correcto de las funciones, lo que hará que las cosas sean difíciles de entender más adelante. Siempre les digo a los progtwigdores que cada vez que programe, escriba el código de tal manera que después de 5 años, si alguien más mira el código, debería comprender el código.

El uso de nombres de métodos de acceso a datos y algunas acciones crean confusión a largo plazo … como en el caso de Stack, Push / Pop son acciones, pero “Size” o “Count” son datos.

La creación de propiedades de “Recuento” simplemente distingue su propósito como datos en lugar de acción.

El enlace de datos

Como lo mencionaron otros, las propiedades ofrecen un nivel avanzado de enlace de datos como enlace bidireccional, etc.

Restricciones de acceso

Puede tener propiedades de solo lectura y accesos adicionales como los mencionaron otros.

Reflexión

Es poco fácil trabajar con propiedades en caso de escribir código genérico basado en la reflexión.

Implementación de almacenamiento diferente

Las variables públicas almacenan datos solo como miembros, donde las propiedades proporcionan varias maneras de almacenar datos en diferentes formas, como internaly, pueden almacenarse como hashtable (como se hacen en objetos de dependencia en WPF). Pueden ser almacenados en caché. Ellos serán retransmitidos a otras entidades secundarias o entidades desconocidas. Sin embargo, la implementación está oculta para las personas que llaman.

Validación

Establecer propiedad puede requerir cierta validación, y el código de validación en la parte “Establecer” del código puede ayudarlo a validar la entrada e informar errores en consecuencia.

Notificaciones

Establecer parte del método puede generar eventos de notificación como INotifyPropertyChanged.PropertyChanged que otros objetos pueden escuchar y actualizar el valor de visualización. Esta es una parte importante del enlace de datos avanzado.

En resumen, es un nuevo “Estándar” de almacenamiento de datos que cuenta con instalaciones avanzadas y luego simplemente almacena los datos en los miembros de la clase. Al evitar las propiedades, normalmente puede realizar todas las funciones, pero como la implementación puede diferir de persona a persona, es un estándar que ayuda a todos a definir / acceder / validar / notificar el almacenamiento de datos en una sola forma llamada “Propiedades”

Como señaló Justin, la encapsulación es uno de los principios básicos de OOP. Desea mantener oculta la representación interna de los datos de su clase y proporcionar formas aprobadas de visualizarla / manipularla.

Las propiedades de C # son construcciones que proporcionan una manera fácil de hacerlo. En su ejemplo, no está haciendo nada dentro de los métodos de get y set , pero en la vida real puede necesitar hacer ciertas cosas como

  • Almacene la moneda en décimo de centavos como un entero largo pero regrese al mundo exterior como una cadena con 2 espacios decimales y un signo $.
  • Restrinja una determinada propiedad para que sea de solo lectura (o incluso de solo escritura: por ejemplo, una clase de generador de contraseña / validador de contraseña).
  • Cambia el estado del objeto de alguna manera cuando este valor se establece / obtiene.

En Java, escribe getters y setters que son métodos antiguos que devuelven o aceptan un valor respectivamente.

Son útiles para el enlace de datos.