Domanda

Sono consapevole che boxe e unboxing sono relativamente costosi in termini di prestazioni. Quello che mi chiedo è:

fa passare un tipo di valore di parametro per out causa boxe un metodo / unboxing della variabile (e quindi un calo di prestazioni)? Può il compilatore di ottimizzare questa via?

  int number;
  bool result = Int32.TryParse(value, out number);
È stato utile?

Soluzione

Come altri hanno già fuori a punta, non c'è la boxe qui. Quando si passa una variabile come argomento corrispondente ad un out o un parametro ref, quello che stai facendo è fare un alias alla variabile . Non stanno facendo nulla al valore della variabile. Stai facendo due variabili rappresentano la stessa posizione di memorizzazione.

Pugilato avviene solo quando un valore di un tipo di valore viene convertito in un valore di un tipo di riferimento, e non c'è alcuna conversione di qualsiasi tipo nel tuo esempio. Il tipo di riferimento deve naturalmente essere System.Object, System.ValueType, System.Enum o qualsiasi interfaccia. Di solito è abbastanza chiaro; c'è una conversione esplicita o implicita nel codice. Tuttavia, ci possono essere circostanze in cui è meno chiaro. Ad esempio, quando un metodo virtuale non-override di tipo base di una struct viene chiamato, c'è boxe. (Ci sono anche situazioni bizzarre in cui certi tipi di vincoli di tipo generico può causare la boxe inaspettato, ma di solito non venire in pratica.)

Altri suggerimenti

No boxe, compilatore utilizza l'istruzione ldloca.s che spinge un riferimento alla variabile locale nello stack (http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.ldloca_s (VS.71) aspx)

.method private hidebysig static void Func() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 num,
        [1] bool flag)
    L_0000: nop 
    L_0001: ldstr "5"
    L_0006: ldloca.s num
    L_0008: call bool [mscorlib]System.Int32::TryParse(string, int32&)
    L_000d: stloc.1 
    L_000e: ret 
}

No, non c'è Boxing (richiesto / coinvolti).

Quando si esegue Box una variabile, le modifiche al caso in scatola non influenzano l'originale. Ma questo è esattamente ciò che si suppone out fare.

Il compilatore 'in qualche modo' costruisce un riferimento alla variabile originale.

Non c'è la boxe; il parametro di out fa è che specifica numero deve essere assegnato al all'interno del metodo TryParse. A prescindere da questo, è ancora trattato come un int, non un object.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top