我读过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;
是拆箱吗?或者它不是拆箱?
答案 0 :(得分:17)
不要再考虑堆栈和堆;这完全是错误的思考方式。强调不“盒装”的意思是“在堆上”,因此“堆上”的任何东西都必须“装箱”。
堆栈和堆是无关紧要的。相反,请考虑引用和值。 值类型的值在必须被视为对象的引用时被加框。如果需要引用值类型的值,则创建一个框,将值放入框,并参考框。现在,您可以参考值类型的值。
不要混淆引用值类型的变量;这是完全不同的。变量和值是两个非常不同的东西;要引用变量,请使用“ref”关键字。
答案 1 :(得分:10)
装箱或拆箱与在堆或堆栈上存储值无关。你应该阅读the article "Boxing and Unboxing" from the C# Programming Guide。在您的示例中,这两个都不会发生,因为您将int分配给int。
答案 2 :(得分:7)
它既不是unboxing
也不是boxing
。
考虑到您在没有强制转换的情况下分配给int
,我希望此代码可以编译,这意味着cls.Value
是Integer(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
以使其成为引用类型。