ValueType становится упакованным, когда объявлен как часть класса? - PullRequest
3 голосов
/ 18 ноября 2010

Учитывая этот класс:

public class Foo
{
    public Int32 MyField;
}

Я полагаю, что член "MyField" не находится в стеке потоков, поскольку, поскольку к нему могут обращаться несколько потоков, он обязательно должен находиться в управляемой куче, но означает ли это, что он упакован и распакован при каждом использовании?

Заранее спасибо

Ответы [ 4 ]

8 голосов
/ 18 ноября 2010

Нет, он не упаковывается каждый раз, когда его используют.Упаковка происходит только тогда, когда вы приводите тип значения к ссылочному типу - он действительно не имеет никакого отношения к тому, где была выделена фактическая память для значения (или даже если была выделена какая-либо память).

В вашем случае именно то, как вы будете действовать в MyField, будет определять, упакован ли он, а не как Foo.

  //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;

Обратите внимание, что во втором примере val теперь содержитссылка на штучной упаковке Int.MyField по-прежнему (и всегда будет оставаться) как unboxed int, и к нему можно получить доступ без распаковки (спасибо за указание на необходимые пояснения, LukeH )

2 голосов
/ 18 ноября 2010

Нет, бокс происходит только тогда, когда тип значения обрабатывается как System.Object (обычно неявным приведением, то есть передачей его как параметра метода)

2 голосов
/ 18 ноября 2010

Нет, тип значения не упакован.

Упаковка происходит только тогда, когда вы используете тип значения, как если бы он был объектом, например, при сохранении int в массиве object. То есть:

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

В этом случае тип значения указан в рамке.

Но тип значения, хранящийся в виде поля внутри класса, не упакован.

1 голос
/ 18 ноября 2010

Типы значений упаковываются, только когда они назначены переменной ссылочного типа (например, object).Если вы никогда не назначите MyField чему-либо, кроме int или другой структуры, к которой он может быть приведен (например, double), он никогда не будет помещен в коробку.

...