Pregunta Diferencia entre las propiedades automáticas y el campo público en C # 3.0


No pude entender por qué existe la característica de lenguaje de propiedad implementado automáticamente en C # 3.0.

Cuál es la diferencia que está haciendo cuando dices

public string FirstName;

que

public string FirstName { get; set; }

16
2017-08-01 16:32


origen


Respuestas:


Porque se implementan de forma diferente en el código IL resultante (y en el lenguaje de la máquina). Una propiedad automática todavía está expuesta como getter y setter públicos, mientras que un campo público es solo eso - un solo campo ...

Por lo tanto, la implementación de una propiedad automática le permite en una fecha posterior cambiar el comportamiento interno de getter o setter (como agregar un validador) sin recompilar o volver a codificar las clases dependientes que lo usan ...


21
2017-08-01 16:37



Solo para agregar a lo que otras personas han dicho, declarando un campo público, el campo es accesible para leer y escribir. declarando propiedad pública automática, aunque la propiedad es pública, puede agregar modificador para controlar la accesibilidad en el nivel get / set.

public string FirstName { get; private set; }

El usuario de su clase ve FirstName como propiedad pública. Sin embargo, él / ella no puede escribir en él.


9
2017-08-01 16:50



Considere lo que sucede si luego desea cambiar cada uno de ellos a una propiedad con una implementación personalizada. Si se trata de una propiedad implementada automáticamente, simplemente agrega un campo y cambia la implementación. Completa compatibilidad de fuente y binario.

Si es un campo para empezar, no obtienes ni fuente ni compatibilidad binaria. Tienes que reconstruir todo lo que hace referencia a él, y arreglar todo lo que ya no compila.

Adicionalmente, las propiedades tienen varios beneficios sobre los campos. Mi principal objeción personal a los campos es que expone una implementación decisión en la API.


5
2017-08-01 16:39



La diferencia es que otros ensamblados compilados con código que leen la propiedad se compilan contra una propiedad.

Si luego decide que necesita agregar código al captador o al colocador, puede hacerlo, sin tener que forzar a los demás ensamblados vinculados a ello a recompilar.

No es así con los campos. Si más adelante cambia un campo para que sea una propiedad, para agregar ese código, otros ensamblajes vinculados con los suyos dejarán de funcionar correctamente, ya que están compilados para leer un campo, no una propiedad.

Además, se escribe mucho código para encontrar propiedades, no campos, como el enlace de datos y similares.


2
2017-08-01 16:38



debido a este uso:
public string FirstName { get; private set; }
propiedad fácil, ese 'kosher' según las reglas de OO


2
2017-08-01 16:52



El primero es un campo público, mientras que el segundo es una propiedad pública.

La principal diferencia radica en cómo se usan. Por ejemplo, WPF solo puede enlazar datos a propiedades, no a campos.


0
2017-08-01 16:38



Las propiedades automáticas son propiedades normales generadas por el compilador, usan campos de respaldo como cualquier propiedad regular pero no es necesario escribir el código para eso. Aquí hay una muestra muy ilustrativa (gracias a Reflector) del código generado por el compilador:

[CompilerGenerated]
private string <ContentType>k__BackingField;

public string ContentType
{
    [CompilerGenerated]
    get
    {
        return this.<ContentType>k__BackingField;
    }
    [CompilerGenerated]
    set
    {
        this.<ContentType>k__BackingField = value;
    }
}

0
2017-08-01 16:53