Proprietà e campi sono due concetti fondamentalmente diversi. I campi sono semplici variabili definite nella tua classe. Sono - più o meno - accessibili direttamente. Puoi vedere questo nel codice IL per impostare una variabile membro
memberVariable = "Test";
produce il seguente codice IL
IL_0000: ldarg.0
IL_0001: ldstr "Test"
IL_0006: stfld UserQuery.field
Le proprietà d'altra parte sono più funzioni delle variabili, sebbene siano accessibili come variabili (dal codice C #, non da IL). C'è molto altro in sottofondo.
La proprietà automatica
public string AutoProperty { get; set; }
e impostandolo
AutoProperty = "Hallo";
produrrà il seguente codice IL.
Proprietà:
get_AutoProperty:
IL_0000: ldarg.0
IL_0001: ldfld UserQuery.<AutoProperty>k__BackingField
IL_0006: ret
set_AutoProperty:
IL_0000: ldarg.0
IL_0001: ldarg.1
IL_0002: stfld UserQuery.<AutoProperty>k__BackingField
IL_0007: ret
Impostazione della proprietà:
IL_0000: ldarg.0
IL_0001: ldstr "Hallo"
IL_0006: call UserQuery.set_AutoProperty
Come puoi vedere, il compilatore genera un metodo set_AutoProperty
con il campo di supporto implicito UserQuery.<AutoProperty>k__BackingField
.
Wny dovresti davvero usare le proprietà
Sebbene le proprietà automatiche non siano praticamente più utilizzabili dei campi pubblici, le proprietà esplicite hanno i loro meriti, dal momento che è possibile disaccoppiare gli interni di una classe dalla sua interfaccia pubblica. Vedi la seguente implementazione della temperatura
class Temperature
{
double _kelvin = 0;
public double Fahrenheit
{
get
{
return _kelvin*9.0/5.0 - 459.67;
}
set
{
_kelvin = (value + 459.67) * 5.0/9.0;
}
}
public double Celsius
{
get
{
return _kelvin - 273.15;
}
set
{
_kelvin = value + 273.15;
}
}
}
Il tuo cliente non conosce la rappresentazione interna della temperatura, sa solo che può ottenere la temperatura in ° Fahrenheit o ° Celsius, a seconda delle sue esigenze. Se è conveniente per te, la rappresentazione interna può cambiare senza cambiare l'interfaccia pubblica. D'altra parte, se decidi di esporre la temperatura in Kelvin come campo pubblico, dovrai mantenerla o rischiare di spezzare il codice cliente.
Prestazioni delle proprietà
Secondo le risposte a questa domanda , il compilatore inline il chiama a set_AutoProperty
e get_AutoProperty
se questo è possibile. Questa è probabilmente la ragione per cui non hai trovato alcuna differenza tra questi due. Purtroppo non sono stato in grado di replicare il comportamento del compilatore in LINQPad.