6

我读了什么是装箱和拆箱以及权衡取舍是什么?但不能理解一件事。假设我有一堂课:

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

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

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

作为放置在堆中的类,我猜 Value 也放置在堆中?因此操作

int i = cls.Value;

是拆箱吗?还是不是拆箱?

4

4 回答 4

17

停止思考堆栈;这是完全错误的思考方式。“装箱”并不是“在堆上”的意思,因此“堆上”的任何东西都必须是“装箱”的。

堆栈和堆无关紧要。相反,请考虑参考价值观当必须将值类型的值视为对对象的引用时,它会被装箱。如果你需要一个值类型的值的引用,你做一个盒子,把值放在盒子里,然后对盒子做一个引用。在那里,现在您有了对值类型值的引用。

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

于 2012-01-10T20:43:59.270 回答
10

装箱或拆箱与在堆或堆栈上存储值没有任何关系。您应该阅读C# Programming Guide 中的文章“装箱和拆箱”。在您的示例中,这两个都没有发生,因为您将 int 分配给 int。

于 2012-01-10T20:25:08.710 回答
7

既不是unboxing也不是boxingint 考虑到您在没有强制转换的情况下分配,并且我希望这段代码可以编译,这意味着它cls.Value是一种Integer(int)类型。所以分配intint. 这里发生的是一个值拷贝

于 2012-01-10T20:24:00.060 回答
0
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以使其成为引用类型。

于 2012-01-10T20:31:04.673 回答