2010-11-24 13 views
11

Cuál es la diferencia (rendimiento, memoria, etc ...) entre la encapsulación de un miembro privado como esto¿Cuál es la diferencia entre encapsular a un miembro privado como una propiedad y definir una propiedad sin un miembro privado?

private int age; 
public int Age 
{ 
    get { return age; } 
    set { age = value; } 
} 

y definir una propiedad como esta

public int Age 
{ 
    get ; 
    set ; 
} 
+0

Pregunta relacionada: http://stackoverflow.com/questions/1294660/c-automatic-properties –

+0

También http://stackoverflow.com/questions/3532038/correct-use-of-c-properties – Nobody

Respuesta

5

El código que el compilador de C# genera para auto-implemented propertieses casi idéntica a el primer ejemplo (que utiliza un campo de copias de seguridad privada), así que no me preocuparía demasiado.

El solo la diferencia real es que decora el captador de propiedades y el colocador con el atributo [CompilerGenerated]. Esto no debería tener ningún impacto en el rendimiento de obtener y configurar la propiedad. (Como pequeño nitpick, eso debería aumentar el tamaño del binario del ensamblaje muy ligeramente).

Lo que me gusta de las propiedades implementadas automáticamente, aparte de la brevedad es que previene que incluso el tipo declarante acceda al campo de respaldo en lugar de la propiedad (el campo de respaldo es anónimo). Esto aporta claridad al código y, en general, también facilita la refactorización/cambio de la implementación de la propiedad.

+1

No es la única diferencia: el campo de respaldo de la propiedad no se puede marcar 'readonly' mientras que el campo explícito sí puede marcarse. –

+0

@ Paul Ruane: Es cierto, pero estoy hablando de las diferencias entre las 2 muestras proporcionadas por el OP. – Ani

11

En el segundo caso, el compilador de C# generará un campo para usted y generar un getter y setter para acceder a ella. En otras palabras, no hay diferencia funcional entre las dos muestras de código que ha publicado. La única diferencia será el nombre del campo privado, que será generado por el compilador.

+2

Bastante esto. Tenga en cuenta que también puede configurar el setter en privado: public string Name {get; conjunto privado; } –

+0

eso es bastante bueno, por ejemplo –

+2

Excepto que no se puede hacer una propiedad automática 'readonly' que impida que su valor cambie la construcción de publicaciones. Esto solo me impide usar auto-propiedades en muchos casos. –

1

hice esta pregunta hace un tiempo:

ver Correct use of C# properties

Citando la respuesta:

Son equivalentes en forma compilada interna, excepto que no se puede acceder al compilador generado privada variable en la segunda forma.

Desde el punto de vista de la eficiencia del código, que son equivalentes, así, el compilador justo a tiempo que normalmente se accede directamente a la variable privada sin la sobrecarga de llamar a una función de acceso (después de que el entorno de ejecución ha comprobado la accesibilidad, etc.).

Desde una perspectiva de codificación, prefiero la segunda versión que es más compacta (menos para escribir, menos para leer).

La segunda sintaxis se introdujo en C# 3.0. Entonces, la primera variante sería más compatible con los viejos compiladores.

1

La diferencia es que usted tiene control sobre los getters y setters.

Con la implementación automática, no se puede hacer algo como:

private int age; 

public int Age 
{ 
    get { return age; } 
    set 
    { 
     if (age != value) 
     { 
      age = value; 
      OnAgeChanged(EventArgs.Empty); 
     } 
    } 
} 

public event EventHandler AgeChanged; 

protected virtual void OnAgeChanged(EventArgs e) 
{ 
    var handler = AgeChanged; 

    if (handler != null) 
     handler(this, e); 
} 

Si no necesita esto, la aplicación automática debería ser suficiente.

La principal ventaja sobre el uso de una aplicación automática de la propiedad en comparación con un campo es que cuando se utiliza una aplicación automática de la propiedad y más tarde desea cambiar la aplicación en, por ejemplo, lo anterior, la interfaz de su clase no cambia.

+0

Así es, gracias por la información –

+0

De nada. –

1

no hay diferencia en comparación con el rendimiento en el segundo caso es el azúcar sintético para escribir propiedades de propiedad automática llamada.

si quiere poner algo de lógica en el conjunto o obtener parte, no podrá hacerlo automáticamente.

Cuestiones relacionadas