2009-10-06 14 views
12

¿Me puede decir cuál es el uso exacto de las propiedades en C# me refiero explicación práctica¿Por qué necesitamos Propiedades en C#

en nuestro proyecto estamos utilizando propiedades como

/// <summary> 
/// column order 
/// </summary> 
protected int m_order; 

/// <summary> 
/// Get/Set column order 
/// </summary> 
public int Order 
{ 
    get { return m_order; } 
    set { m_order = value; } 
} 

/// <summary> 
/// constructor 
/// </summary> 
/// <param name="name">column name</param> 
/// <param name="width">column width</param> 
/// <param name="order">column order</param> 
public ViewColumn(string name, int width, int order) 
{ 
    // 
    // TODO: Add constructor logic here 
    // 
    m_name = name; 
    m_width = width; 
    m_order = order; 
} 


/// <summary> 
/// returns the column name, width, and order in list view. 
/// </summary> 
/// <returns>string represent of the ViewColumn object</returns> 
public override string ToString() 
{ 
    return (string.Format("column name = {0}, width = {1}, order = {2}.", 
     m_name, m_width, m_order)); 
} 

/// <summary> 
/// Do a comparison of 2 ViewColumn object to see if they're identical. 
/// </summary> 
/// <param name="vc">ViewColumn object for comparison</param> 
/// <returns>True if the objects are identical, False otherwise.</returns> 
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; 
} 
+0

posible duplicado de [¿Debo usar propiedades públicas y campos privados o campos públicos para datos?] (http://stackoverflow.com/questions/1277572/should-i-use-public-properties-and-private-fields-or-public- fields-for-data) – nawfal

Respuesta

16

Piense en esto: Usted tiene una habitación y una puerta para entrar en 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 todos entrarán 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ónUna muy fácil, no había ninguna comprobació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 ha comprobado a la persona y sabe si tiene algo malo con él.

+0

Bonito ..Manténgalo –

31

Respuesta corta: La 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 métodos getX() y setX() vistos en los gustos de Java, etc.

+9

Respuesta corta: para hacer que el patrón getX()/setX() sea más bonito. Respuesta larga: encapsulación. [citación necesitada];) – Jimmy

+1

p. ver http://stackoverflow.com/questions/1461598/what-is-the-point-of-setters-and-getters-in-java – Jimmy

+0

+1 para la respuesta -1 para la pregunta: ¿Por qué no se acepta esta respuesta? –

0

Son útiles para el enlace de datos.

4

Esa es la forma de usarlo, excepto por la forma en que lo está 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 se 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 establecer dentro de la clase pero leer en cualquier otro lado.

Por último, si usted necesita para controlar la lógica, puede escribir lo siguiente:

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... 
    } 
} 
+0

¿me puede dar una explicación práctica con un código – peter

+0

Ahí va, he agregado varios. – jasonh

16

Por 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 recompilar todo, incluso si la nueva implementación utiliza una propiedad con el mismo nombre.
  • Enlace de datos. No puedes enlazar datos a un campo.
+3

¿Alguna vez ha dormido? –

+0

* Bitch bofetada yo mismo * No sabía esa cosa de compatibilidad binaria. Bonito. – Tarik

+0

@Justin: solo en días que terminan en 'y', pero a veces no por mucho tiempo. –

3

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, usted no está haciendo nada dentro de los métodos get y set pero en la vida real, puede que tenga que hacer ciertas cosas como

  • moneda tienda en 10 de centavos como un entero largo, pero volver al mundo exterior como una cadena con 2 espacios decimales y un signo $.
  • Restringir 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.

+0

+1 para el aspecto del especificador de acceso para regular no solo a nivel de datos (como miembros) pero nivel de operación (get/set): solo lectura, solo escritura – jdehaan

+0

En propiedades de nivel IL también son métodos . De hecho, el compilador de C# crea métodos como get_Order y set_Order para la propiedad y no le permitirá definir su propio método con los mismos nombres. – softveda

6

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 pocas palabras, esto nos permite tener acceso al objeto de barras 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.

4

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 crear una instancia de un objeto y establecer datos en sus variables miembro utilizando la 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 cuando se accede al objeto de esa clase.

4

Diseño Tiempo Beneficios

propiedades hace que el diseño visual fácil, usted tiene más famoso del Explorador de propiedades de Visual Studio que le permite cambiar las propiedades de objeto.

Propiedades también proporcionan metadatos adicionales de validación, apariencia visual dentro de Explorador de propiedades, como desplegables, gama, selector de color, etc.

separada de datos y acciones

Lo que verdaderamente representan diferencia entre "datos" de objeto y "Acciones" (Métodos) de objeto.

Cuando miramos la clase, si tenemos 50 métodos para ver, 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 programadores 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étodo 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.

Databinding

como han mencionado otros, ofrecen propiedades de nivel avanzado de enlace de datos, como la unión de dos vías etc.

restricciones de acceso

Puede tener propiedades de sólo lectura y los descriptores de acceso adicionales como se ha mencionado por otros.

Reflexión

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

diferente de almacenamiento de datos Implementación

variables públicas almacenar sólo como miembros, donde las propiedades demás proporcionan diversas formas de almacenar datos en diferentes formas como internaly que se pueden almacenar como tabla hash (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

Propiedad Marco puede requerir cierta validación y código de validación en el "ajuste" parte del código puede fácilmente ayudar a validar la entrada e informar de errores en consecuencia.

Notificaciones

Conjunto parte del método puede provocar eventos de notificación como INotifyPropertyChanged.PropertyChanged el que otros objetos pueden tratar de detectar y actualizar el valor de la pantalla. Esta es una parte importante del enlace de datos avanzado.

En resumen, es un nuevo "Estándar" de almacenamiento de datos que tiene facilidades avanzadas y luego simplemente almacena los datos en los miembros de la clase. Al evitar las propiedades, normalmente puede realizar todas las funciones, pero dado que la implementación puede variar de persona a persona, es un estándar que ayuda a todos a definir/acceder/validar/notificar el almacenamiento de datos en un solo formulario llamado "Propiedades"

Cuestiones relacionadas