C # Confronto tra proprietà e valore Get / Setter

-1

Qualcuno può aiutarmi a capire il processo interno di come funzionano i campi di classe C #? E come funzionano le proprietà di classe (con getter e setter)?

Durante il confronto delle prestazioni, ho trovato che le proprietà sono molto più lente di accesso dei campi. Quindi qual è la ragione di questo?

    
posta mukund jha 13.12.2017 - 12:56
fonte

1 risposta

7

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.

    
risposta data 13.12.2017 - 13:30
fonte

Leggi altre domande sui tag