引用类的值类型成员时是否会发生拆箱?

时间:2012-01-10 20:20:38

标签: c# .net unboxing

我读过What is boxing and unboxing and what are the trade offs?但却无法理解一件事。假设我有一个班级:

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

我想在我的方法中获得价值:

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

作为一个放在堆中的类,我猜那个值也放在堆中了吗?因此操作

int i = cls.Value;

是拆箱吗?或者它不是拆箱?

4 个答案:

答案 0 :(得分:17)

不要再考虑堆栈;这完全是错误的思考方式。强调“盒装”的意思是“在堆上”,因此“堆上”的任何东西都必须“装箱”。

堆栈和堆是无关紧要的。相反,请考虑引用值类型的值在必须被视为对象的引用时被加框。如果需要引用值类型的值,则创建一个框,将值放入框,并参考框。现在,您可以参考值类型的值。

不要混淆引用值类型的变量;这是完全不同的。变量和值是两个非常不同的东西;要引用变量,请使用“ref”关键字。

答案 1 :(得分:10)

装箱或拆箱与在堆或堆栈上存储值无关。你应该阅读the article "Boxing and Unboxing" from the C# Programming Guide。在您的示例中,这两个都不会发生,因为您将int分配给int。

答案 2 :(得分:7)

它既不是unboxing也不是boxing。 考虑到您在没有强制转换的情况下分配给int ,我希望此代码可以编译,这意味着cls.ValueInteger(int)类型。因此,将int分配给int。 这里发生的是值复制

答案 3 :(得分:0)

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以使其成为引用类型。