2009-03-13 14 views
10

¿Alguien puede articular claramente cuando usa un campo y cuándo usar una propiedad en el diseño de clase?¿Cuándo debería usar un campo en lugar de una propiedad?

considerar:

public string Name; 

O:

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

Soy consciente de que el segundo método es más adecuado y flexible, así que eso es lo que trato de usar, por lo general.

Pero entonces ¿por qué veo que las personas usan el primer método? ¿Son perezosos o hay alguna situación específica en la que es la elección correcta? ¿Es solo una cuestión de preferencia?

+0

Como comentario, el uso de guiones bajos para sus miembros privados no es una forma .NET de hacer las cosas. Consulte http://msdn.microsoft.com/en-us/library/ms229045.aspx – Alan

+0

Está mezclando campos con atributos. nombre de cadena pública; es un campo público, no un atributo. –

+0

http://www.codinghorror.com/blog/archives/000654.html Mire este sinsentido. – Alan

Respuesta

15

bien en C# 3.0 en realidad se puede escribir:

public string Name {get; set;} 

cual le permite ser adecuada y perezoso.

En términos generales, con las propiedades, obtiene la encapsulación adecuada. Usted tiene la opción de permitir establecer un valor, obtenerlo o ambos. Al usar un miembro público, no tienes esa opción.

Probablemente sea una preferencia parcial, y una parte de cómo su equipo decide manejar definiciones de clase rápidas y sucias, pero yo diría que use propiedades para get/sets.

Para responder

¿Alguien puede articular claramente cuando se utiliza un atributo y cuándo utilizar una propiedad en el diseño de clases?

Nunca debe usar un atributo público. Siempre deberías usar una propiedad. Es más seguro y más flexible. Dicho esto, las personas serán flojas y solo usarán un miembro público. Sin embargo, con C# 3.0 puede usar una sintaxis más precisa para definir las propiedades, lo que debería satisfacer su pereza interna.

Simplemente escriba prop y pulse <tab> para agilizar la pereza al agregar una propiedad.

+4

Solo una nota: Nunca deberías decir "should not ever" cuando hables el código. – Alan

+0

* "Nunca deberías usar un atributo público" * suena más como una opinión personal que como una respuesta técnica –

3

Las propiedades son más fáciles de mantener que los campos, puede encapsular la lógica en sus setters/getters, lo que le permite ocultar la implementación.

También facilitan la refabricación.

Más información:

14

Sólo un poco de información adicional a la respuesta de Alan:

public string Name {get; set;} 

es la misma que

private string _Name; 

public string Name{ 
get { return _Name; } 
set { _Name = value; } 
} 

Si quiere desactivar la función de conjunto de Nombre, puede tener

cadena pública Nombre {get; conjunto privado;}

+1

+1 para el establecimiento privado. Siempre pienso que es genial :) –

0

El uso de propiedades que se pueden controlar es la seguridad:

public string Foo { protected get; private set; } 

Propiedades da forma fácil de provocar eventos:

public string Foo 
{ 
    get { return _foo; } 
} 
set 
{ 
    bool cancel = false; 
    if(BeforeEvent != null) // EventHandler<CancelEventArgs> BeforeEvent 
    { 
    CancelEventArgs e = new CancelEventArgs(); 
    BeforeEvent(this, e); 
    cancel = e.Cancel; 
    } 
    if(!cancel) 
    { 
    _foo = value; 
    if(AfterEvent != null) // EventHandler<EventArgs> AfterEvent 
    { 
     AfterEvent(this, new EventArgs()); 
    } 
    } 
} 

también que a menudo utilizan un código como éste:

string Foo 
{ 
    set 
    { 
    IsFooSet = value != null; 
    } 
} 

bool IsFooSet 
{ 
    get { return _isFoo; } 
    set 
    { 
    _isFoo = value; 
    if(value) // some event raise or controls on form change 
    } 
} 
0

Cuando hace que el campo sea público, permite que Estados Unidos hacer lo que quieran hacer al campo. Pueden asignar valores inesperados, valores no válidos, valores que pueden causar desbordamiento, etc.

Con la propiedad, usted tiene control sobre si se permite establecer nuevos valores en el campo, masajeando el valor antes de almacenarlo, notificando a los interesados partes sobre el cambio del valor del campo, etc. Y la misma idea para devolver el valor a través del comprador. Para .NET Framework desde 2.0, puede configurar el acceso para el getter, setter. Supongamos que solo quiere que el usuario tenga acceso de lectura al campo, luego hace que el captador sea público, pero el colocador sea privado o esté protegido.

0

Además de los motivos ya dados para preferir propiedades, también hay muchas cosas interesantes en System.ComponentModel que hacer con el enlace de datos y notificación de cambio que solo funciona con propiedades, en lugar de campos. Por ejemplo, mire la documentación sobre PropertyChangedHandler.

0

Una propiedad como la definida anteriormente actúa como un getter y setter. Los únicos beneficios de usar una propiedad es que puede tratarla como una variable con restricción de acceso.

public string Name { get; private set; } 

Esta propiedad se puede acceder de forma pública, pero solo se puede configurar de forma privada. (¡No querría que nadie cambie su nombre sin su consentimiento ahora lo haría!;))

Cuestiones relacionadas