Fa passare un tipo di valore in un parametro “out” causa la variabile da inscatolato?
-
24-10-2019 - |
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);
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
.