我读了什么是装箱和拆箱以及权衡取舍是什么?但不能理解一件事。假设我有一堂课:
class MyClass
{
public int Value { get; set; }
}
我想在我的方法中获得价值:
void MyFunc(MyClass cls)
{
int i = cls.Value;
}
作为放置在堆中的类,我猜 Value 也放置在堆中?因此操作
int i = cls.Value;
是拆箱吗?还是不是拆箱?
我读了什么是装箱和拆箱以及权衡取舍是什么?但不能理解一件事。假设我有一堂课:
class MyClass
{
public int Value { get; set; }
}
我想在我的方法中获得价值:
void MyFunc(MyClass cls)
{
int i = cls.Value;
}
作为放置在堆中的类,我猜 Value 也放置在堆中?因此操作
int i = cls.Value;
是拆箱吗?还是不是拆箱?
停止思考堆栈和堆;这是完全错误的思考方式。“装箱”并不是“在堆上”的意思,因此“堆上”的任何东西都必须是“装箱”的。
堆栈和堆无关紧要。相反,请考虑参考和价值观。 当必须将值类型的值视为对对象的引用时,它会被装箱。如果你需要一个值类型的值的引用,你做一个盒子,把值放在盒子里,然后对盒子做一个引用。在那里,现在您有了对值类型值的引用。
不要将其与引用值类型的变量混淆;那是完全不同的。变量和值是两个非常不同的东西。要引用变量,请使用“ref”关键字。
装箱或拆箱与在堆或堆栈上存储值没有任何关系。您应该阅读C# Programming Guide 中的文章“装箱和拆箱”。在您的示例中,这两个都没有发生,因为您将 int 分配给 int。
既不是unboxing
也不是boxing
。int
考虑到您在没有强制转换的情况下分配,并且我希望这段代码可以编译,这意味着它cls.Value
是一种Integer(int)
类型。所以分配int
给int
. 这里发生的是一个值拷贝。
int i = 5;
object o = i; // boxing of int i
int i = (int)o; // unboxing of object o
请注意,我们不是分配i
给对象的字段或属性,而是分配给对象本身。它可以与光的性质相媲美。光可以被感知为由粒子(光子)构成或被视为波。Anint
可以是int
对象(引用类型)或int
值类型。但是,您不能int
直接将 an 定义为引用类型;您必须将其转换为对象,例如通过将其分配给类型的变量、参数或属性object
或将其转换为object
以使其成为引用类型。