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

azh*_*kov 6 .net c# unboxing

我读了什么是拳击和拆箱,有什么权衡?但无法理解一件事.假设我有一个班级:

class MyClass
{
    public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

void MyFunc(MyClass cls)
{
    int i = cls.Value;
}
Run Code Online (Sandbox Code Playgroud)

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

int i = cls.Value;
Run Code Online (Sandbox Code Playgroud)

拆箱?或者它不是拆箱?

Eri*_*ert 17

不要再考虑堆栈堆了 ; 这完全是错误的思考方式.重点不是 "盒装"意味着"在堆上",因此"堆上"的任何东西都必须"装箱".

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

不要将它与引用值类型变量混淆; 这是完全不同的.变量和值是两个非常不同的东西; 要使用"ref"关键字来引用变量.

  • @ OlivierJacot-Descombes:我没有丝毫跟随你.Int是一种值类型; 没有int类.我怀疑你并没有非常准确地推断一个对象拥有一个类型意味着什么.盒装int的类型为int; unboxed int也是int类型.我有一只猫; 她属于Felis Catus.我把她放在一个盒子里,在地板上画一个指向盒子的箭头.*她仍然属于Felis Catus*.盒装猫和无箱猫都是猫; 与整数相同.我不知道你在这里得到了什么. (5认同)
  • 将鱿鱼放入装有猫的盒子里时,猫是活着还是死了,还是两者兼而有之? (4认同)
  • @IgbyLargeman:这是生物学的基本问题:当你把两个生物放在一个盒子里,哪一个吃掉另一个? (3认同)
  • 虽然从C#角度来看可能没有"盒装类型"这样的东西,但请注意,从CLI的角度来看(参见ECMA CLI规范的分区I的8.2.4节)."对于每种值类型,CTS定义了一个称为盒装类型的相应引用类型." 但是,"盒装类型不能通过名称直接引用,因此不能给字段或局部变量赋予盒装类型." (3认同)
  • 是的,Igby,有一种神奇的独角兽类型.它存在于爱,慷慨和奉献的存在,你知道它们丰富并赋予你的生命最高的美丽和快乐.唉! 如果没有神奇的独角兽类型,世界会变得多么沉闷! (3认同)
  • @IgbyLargeman:一路划过天空! (3认同)

emp*_*mpi 10

装箱或拆箱与在堆或堆栈上存储值无关.您应该阅读C#编程指南中的文章"Boxing and Unboxing".在您的示例中,这两个都不会发生,因为您将int分配给int.


Tig*_*ran 7

它既不是unboxing也不是boxing.考虑你分配给int 没有演员,我希望,这个代码编译,这意味着这cls.Value是一种Integer(int)类型.所以分配intint.这里发生的是价值复制.