Frage

Unter Berücksichtigung dieser Klasse:

public class Foo
{
    public Int32 MyField;
}

Ich denke, die „MyField“ Mitglied nicht auf dem Thread-Stack ist, weil, wie es von mehreren Threads zugegriffen werden konnte, ist es auf jeden Fall in dem verwalteten Heap sein, aber nicht bedeutet, dass es es ist eingerahmt und unboxed jedes Mal es verwendet wird?

Vielen Dank im Voraus

War es hilfreich?

Lösung

Nein, ist es nicht jedes Mal boxed es verwendet wird. Box erfolgen nur, wenn Sie einen Werttyp in einen Referenztyp Nötigung - es ist wirklich nichts für den Wert mit dem der tatsächlichen Speicher zugewiesen wurde, zu tun hat (oder auch wenn ein Speicher zugewiesen wurde).

In Ihrem Fall ist es, wie Sie auf MyField handeln, die bestimmen, wenn es verpackt ist, nicht, wie Foo behandelt wird.

  //No Boxing
  var f = new Foo();
  f.MyField = 5;
  int val = f.MyField;


  //Boxing
  var f = new Foo();
  f.MyFIeld = 5;
  object val = f.MyField;

Beachten Sie, dass im zweiten Beispiel val nun einen Verweis auf eine boxed int enthält. MyField ist immer noch (und wird es immer bleiben) ein unboxed int und kann für den Hinweis auf die nötige Klärung ohne Unboxing (dank zugegriffen werden, LukeH )

Andere Tipps

Nein, der Werttyp nicht verpackt.

Boxen nur auftreten, wenn Sie einen Werttyp verwenden, als ob es ein Objekt ist, wenn beispielsweise in einem Array von int einen object speichern. Das heißt:

object[] a = new object[10];
int x = 1;
a[0] = x;

In diesem Fall wird der Wert Typ eingerahmt wird.

Aber ein Werttyp als ein Feld in einer Klasse gespeichert ist, nicht eingerahmt.

Nein, Boxen tritt nur auf, wenn ein Wert Typ als System.Object behandelt wird (in der Regel durch implizites Gießen, das heißt, es als ein Verfahren Parameterübergabe)

Werttypen nur verpackt werden, wenn sie mit einer Referenztyp Variablen zugewiesen sind (z object). Wenn Sie noch nie assign MyField auf etwas anderes als ein int oder eine andere Struktur zu dem sie gegossen (z double) sein, wird es nicht immer eingerahmt werden.

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