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);
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top