2011-06-25 30 views
8

He estado aprendiendo C# por un tiempo, y he encontrado propiedades en mi libro C# (Head First C#). Honestamente, no entiendo para qué se usan y por qué debería usarlos. Los he buscado en Google varias veces, pero todavía no puedo entenderlos.Por favor, explique cómo funcionan las propiedades de C#

¿Puede alguien explicarme este concepto extranjero?

Gracias,

Varmitharen

+1

Extranjero * en comparación con qué *? ¿Qué estás usando actualmente? campos públicos? –

+0

Sí, campos normales – Varmitharen

+2

sí, no hagas eso; p Los campos públicos casi nunca son una buena idea. –

Respuesta

3

Propiedades para enriquecer el concepto de encapsulación de la programación orientada a objetos.

es decir, encapsulan un miembro de campo y le permiten a usted (el desarrollador) controlar cómo se realiza la configuración/obtención de esta variable. ¿Ejemplo?

public class Person 
{ 
    private int m_age; 

    public int Age 
    { 
     set 
     { 
      if(value < 18) 
       m_age = 18; 
      else 
       m_age = value; 
     } 
     get 
     { 
      return m_age; 
     } 
    } 
} 

Ver? utilizando la propiedad Age, garantizamos que el valor mínimo establecido de edad es 18.

+0

NO necesariamente encapsulan un miembro de campo. – jason

+0

E incluso cuando encapsulan un miembro de campo, el miembro de campo no es necesariamente del mismo tipo que la propiedad. No me gusta mucho este ejemplo; Por lo general, prefiero que las propiedades que tienen tanto un 'get' como un 'set' tengan 'get' el valor 'set'. – Brian

+0

@Brian, esto se determina de acuerdo con las necesidades del desarrollador y el caso en cuestión, y en ocasiones podemos poner lo que nos gusta a un lado a favor de lo que es "mejor". Por otro lado, por la forma en que se planteó esta pregunta, deduje que el OP necesita un ejemplo simple para captar la idea de Propiedades, es por eso que mi respuesta fue la aceptación del autor y no la aceptación de la comunidad. Las otras respuestas son muy buenas. –

1

¿Está familiarizado con los campos, entonces? Si es así, desde el punto de vista del código que consume su clase, las propiedades son exactamente como campos. Sin embargo, dentro de su clase, una propiedad es como un par de métodos, uno que trata de devolver el valor al consumidor y otro que trata de actualizar el valor. Estos métodos generalmente se llaman getters y setters.

Una buena razón para querer utilizar una propiedad en lugar de un campo es que le da un mejor control de los valores que entran y salen de la propiedad.

17

Las propiedades proporcionan acceso controlado a; en el más básico, puede simplemente significar que encapsula un campo (no se recomiendan los campos públicos), que el compilador puede hacer que sea fácil para usted:

public int Foo {get;set;} // the compiler handles the field for you 

Se podría, sin embargo, utilizar la propiedad de hacer cumplir la lógica o el mango lateral efectos:

private int foo; 
public int Foo { 
    get { return foo; } 
    set { 
     if(value < 0) throw new ArgumentOutOfRangeException(); 
     if(value != foo) { 
      foo = value; 
      OnFooChanged(); // fire event notification for UI bindings 
     } 
    } 
} 

Otras opciones comunes son perezosos de carga, los miembros calculados, los miembros pasan por el proxy, etc.

también puede cambiar la accesibilidad, por ejemplo:

public int Foo { get; protected set; } 

que sólo puede ser asignado por el tipo y subclases, no por código no relacionado. También podría tener un obtener o establecer.

Básicamente, las propiedades actúan como una versión más formal de un par get/de métodos establecido, lo que es mucho más fácil hablar de "Foo", en lugar de "get_Foo"/"set_Foo", etc (en los dos sentidos Unión).

diferencia de los campos, propiedades también pueden ser objeto de publicidad en las interfaces, que es esencial para se utilizan código basado en la interfaz

+0

Otra razón, incluso para las propiedades generadas por el compilador básico sobre los campos, es que le da flexibilidad más adelante al volver a implementar la lógica del getter y setter si es necesario sin volver a compilar el código de consumo. Si publica los campos y luego decide que desea aplicar la lógica del setter, debe hacer que el campo sea privado, implementar una propiedad y luego todos los que consuman su código deben volver a compilar. – jasonh

17

Aunque las otras respuestas son bastante buenas, todas se refieren mucho al mecanismo de las propiedades. También es útil comprender la filosofía de las propiedades.

En la programación OO pasamos mucho tiempo construyendo modelos de dominios semánticos. Cuando dices que tienes una clase "Animal" y una clase derivada "Tigre", estás modelando en el ámbito informático un hecho sobre el mundo real: el de todas las cosas en el mundo, algunas de ellas son animales, y de esos animales, algunos de ellos son tigres.

pero hay que entender que el mecanismo de y la semántica son diferentes. Nadie dice "hey, vayamos al zoológico y miremos las instancias de los métodos de invocación de zookeeper en IFeedable en las instancias de los tigres".

Un campo es mecanismo y por lo tanto debe ser un detalle de implementación privada de una clase; no describe parte del modelo. Una propiedad es una parte del modelo semántico. Cada tigre tiene un cumpleaños, por lo que "Cumpleaños" debería ser una propiedad de la clase Tigre. Eso es parte del "modelo semántico" de los tigres, por lo que exponerlo como una propiedad. Como detalle de la implementación, el cumpleaños se puede almacenar en un campo privado al que acceda la propiedad.

¿Tiene sentido? En resumen: use las propiedades públicas para describir las propiedades semánticas de las cosas que está modelando; usar campos privados como mecanismos de implementación.

+1

'IFeedable' estaba en desuso en favor de' INomNomNomable'. – wootscootinboogie

Cuestiones relacionadas