2010-07-09 31 views
12

Al definir una nueva clase dentro de un proyecto, ¿cuál es la práctica correcta/mejor para hacerlo? En el pasado he creado clases, tales como:¿Cómo definir correctamente las propiedades de clase?

public class MyClass 
    { 
     public string FirstName {get; set;} 
     public string LastName {get; set;} 
    } 

Normalmente me gustaría usar una clase de este tipo para la creación de colecciones dentro de un proyecto.

Sin embargo, ya que siguen para aprender y leer más sobre C# veo ejemplos donde las clases se definen como:

class MyClass //not set to public 
    { 
     private string _firstName; //first defined as fields 
     private string _lastName; 

     public string FirstName // then defined as properties 
     { 
      get { return _firstName; } 
      set { _firstName = value; } 
     } 
     public string LastName 
     { 
      get { return _lastName; } 
      set { _lastName = value; } 
     } 
    } 

es el primer enfoque incorrecto en la definición o se trata de una versión abreviada aceptada dentro de C#? Como práctica recomendada, ¿siempre debe definir primero la clase con campos privados y luego definirlos como propiedades usando get/set a un valor?

Lo pido porque soy autodidacta en C# y estoy tratando de mejorar y entender mejor el enfoque correcto del desarrollo y algunas muestras y tutoriales simplemente exponen los enfoques sin una explicación sólida de por qué se prefiere un enfoque (o debería hacerse) sobre el otro.

Gracias de antemano

+0

En el segundo ejemplo, no debe haber una llave de cierre después del campo _lastname. Eso debería estar al final de la definición de la clase. Las propiedades todavía están definidas dentro del bloque de clase. (a menos que haya algo que no sepa sobre C#) –

Respuesta

16

Su primer ejemplo de:

public class MyClass 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

es específicamente Auto-Implemented Properties, introducido en C# 3.0. Ninguno de los formatos está mal. El primero es más una 'taquigrafía'.

Con los tipos más complejos, a veces es todavía útil para usar el estilo antiguo, y exponer sólo ciertas propiedades o valores de una variable privada, tales como:

public class MyClass 
{ 
    private Dictionary<int, List<string>> _someInternalDictionary; 

    public int MyValuesCount 
    { 
     get 
     { 
      return _someInternalDictionary.Values.Count; 
     } 
    } 

} 

Un ejemplo crudo, pero esperamos que pueda conseguir mi idea.

+5

+1; el primero es mucho más conveniente para las propiedades tontas, y se puede convertir fácilmente en el segundo si se encuentra necesitando lógica. – tzaman

+0

@tzaman: bien dicho. Mis pensamientos exactamente. –

+0

aún mejor: el primer "tonto" puede ser automáticamente reescrito para, por ejemplo, INotifyPropertyChanged en el tiempo de compilación con, por ejemplo, PostSharp – quetzalcoatl

13

La sintaxis abreviada (propiedades de auto implementado) en su primer ejemplo se introdujo en C# 3.0, y no era válido antes de esa fecha. El compilador realmente los convierte a la forma completa con campos de respaldo.

Antes de C# 3.0, la única forma correcta de definir propiedades era con campos de respaldo.

Incluso con C# 3.0, si desea tener alguna lógica en sus propiedades, debe convertirlas para usar campos de respaldo.

En resumen: para las propiedades tontas (las que no hacen nada), use propiedades automáticas. Hacen que su código sea más simple y fácil de leer y se puede convertir.

+0

Gracias por mencionar el paso potencial de convertir las propiedades automáticas. También me gustaría añadir que publicar estos valores como propiedades automáticas significa que puede cambiarlos a propiedades respaldadas manualmente más adelante sin romper la interfaz a nivel binario. Por el contrario, los campos públicos (ick!) No son binarios compatibles con las propiedades públicas del mismo nombre. –

4

Las dos clases que tiene son en la práctica idénticas en funcionalidad y características.

El propósito de la sintaxis de propiedades automáticas (la primera clase) es, básicamente, darle una forma rápida de declarar lo que es esencialmente lo mismo que la segunda clase que muestra.

me quedo con la primera versión hasta que tenga que agregar código al método captador o (como la validación de un nuevo valor para la propiedad.)

El propósito de la sintaxis de la propiedad automática es dual, se parcialmente agregado para facilitar Linq, y parcialmente agregado para que sea más fácil simplemente asegurarte de que declaras propiedades, y no campos públicos.

Si declara una clase utilizando propiedades automáticas (de nuevo, la primera versión), todos los demás ensamblados compilados contra su código sabrán que su clase los declara como propiedades y no como campos. Si luego decide que necesita agregar código, como la validación, esos otros ensambles no necesitan ser recompilados, ya que aún encuentran las propiedades.

+0

¿Podría explicar cómo las propiedades automáticas facilitan LINQ? Yo no veo la conexión yo mismo. – LukeH

+0

Se agregaron como parte del paquete de tipos anónimos. –

+1

Ok, todavía no veo por qué fueron necesarios para Linq. Hm ... –

0

También es posible usar modificador de acceso para obtener y establecer ...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; } 

y supongo que ya tiene conocimiento de Access Modifier.

Cuestiones relacionadas