Происходит ли распаковка при обращении к члену типа значения класса? - PullRequest
6 голосов
/ 11 января 2012

Я прочитал Что такое бокс и распаковка и каковы компромиссы? , но я не могу понять одну вещь.Предположим, у меня есть класс:

class MyClass
{
    public int Value { get; set; }
}

И я хочу получить значение в своем методе:

void MyFunc(MyClass cls)
{
    int i = cls.Value;
}

Как класс, помещенный в кучу, я предполагаю, что Значение помещено в кучу?И поэтому операция

int i = cls.Value;

распаковывается?Или это не распаковка?

Ответы [ 4 ]

17 голосов
/ 11 января 2012

Хватит думать о стеке и куче ;это совершенно неправильный способ думать об этом.Это не это тот случай, когда «в штучной упаковке» означает «в куче», и поэтому все, что «в куче» должно быть «в штучной упаковке».

Стек и куча не имеют значения.Скорее, подумайте о ссылках и значениях . Значение типа значения упаковывается, когда оно должно рассматриваться как ссылка на объект. Если вам нужна ссылка на значение типа значения, вы создаете поле, помещаете значение вполе и сделайте ссылку на поле.И вот, теперь у вас есть ссылка на значение типа значения.

Не путайте это с созданием ссылки на переменную типа значения;это совершенно другое.Переменная и значение - это две разные вещи;чтобы сделать ссылку на переменную , вы используете ключевое слово "ref".

10 голосов
/ 11 января 2012

Упаковка или распаковка не имеют ничего общего с хранением значений в куче или стеке. Вы должны прочитать статью "Упаковка и распаковка" из Руководства по программированию в C # . В вашем примере ничего из этого не происходит, потому что вы присваиваете int для int.

7 голосов
/ 11 января 2012

Это ни unboxing, ни boxing. Учитывая, что вы присваиваете int без cast и, надеюсь, этот код компилируется, это означает, что cls.Value имеет тип Integer(int). Так что присвойте int int. То, что происходит здесь, является значением копии .

0 голосов
/ 11 января 2012
int i = 5;
object o = i;   // boxing of int i
int i = (int)o; // unboxing of object o

Обратите внимание, что мы присваиваем i не поле или свойство объекта, а сам объект.Это сопоставимо с природой света.Свет можно воспринимать как состоящий из частиц (фотонов) или являющийся волной.int может быть объектом int (ссылочный тип) или типом значения int.Однако вы не можете определить int как ссылочный тип напрямую;вы должны преобразовать его в объект, например, присвоив его переменной, параметру или свойству типа object или приведя к object, чтобы сделать его ссылочным типом.

...