Hat Sie einen Wert-Typ in einer "out" - parameter Ursache die variable boxed?
-
24-10-2019 - |
Frage
Ich bin mir bewusst, dass boxing und unboxing sind relativ teuer in Bezug auf die Leistung.Was ich Frage ist:
Hat Sie einen Wert-Typ zu einer Methode out
parameter Ursache boxing/unboxing von der variable (und damit einen performance-Treffer)?Kann der compiler optimieren dies Weg?
int number;
bool result = Int32.TryParse(value, out number);
Lösung
Wie andere haben darauf hingewiesen, es gibt keine Boxen hier.Wenn Sie übergeben eine variable als argument entspricht einer out-oder ref-parameter, was Sie tun, ist machen Sie einen alias für die variable.Sie sind nicht etwas zu tun, um die Wert der variable.Du machst zwei-Variablen repräsentieren den gleichen Speicherort.
Boxen geschieht nur, wenn ein Wert ein Wert-Typ umgewandelt wird, um einen Wert von einem Referenz-Typ, und es gibt keine Konvertierung jeglicher Art in Ihrem Beispiel.Der Typ der Referenz muss natürlich sein System.Object, System.ValueType System.Enum oder eine Schnittstelle.In der Regel, es ist ziemlich klar;es gibt eine explizite oder implizite Konvertierung in den code.Allerdings kann es auch Situationen, in denen es weniger klar.Zum Beispiel, wenn ein nicht-überschriebenen virtuellen Methode um eine Struktur-Basistyp genannt wird, gibt es im Boxen.(Es gibt auch bizarre Situationen, in denen bestimmte Arten von generischen Typ-Einschränkungen kann die Ursache für unerwartete Boxen, aber meistens werden Sie nicht kommen in der Praxis.)
Andere Tipps
Compiler verwendet kein Boxing, der LDLOCA.S-Anweisungen, der einen Verweis auf die lokale Variable auf den Stack drückt (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
}
Nein, es gibt kein Boxen (erforderlich/beteiligt).
Wenn Sie eine Variable boxen, beeinflussen Änderungen an der Boxed -Instanz nicht das Original. Aber genau das ist was out
soll tun.
Der Compiler "irgendwie" konstruiert einen Verweis auf die ursprüngliche Variable.
Es gibt kein Boxen; was zum out
Der Parameter ist angibt, dass die Zahl innerhalb der zugewiesen werden muss TryParse
Methode. Unabhängig davon wird es immer noch als als behandelt int
, nicht ein object
.