Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 类';是否引用了s值类型成员?_C#_.net_Unboxing - Fatal编程技术网

C# 类';是否引用了s值类型成员?

C# 类';是否引用了s值类型成员?,c#,.net,unboxing,C#,.net,Unboxing,我读过,但一件事不懂。假设我有一门课: class MyClass { public int Value { get; set; } } 我想在我的方法中获得价值: void MyFunc(MyClass cls) { int i = cls.Value; } 作为一个放在堆中的类,我猜这个值也放在堆中了吗?因此,操作 int i = cls.Value; 是拆箱吗?或者它不是拆箱?它既不是拆箱也不是装箱。 考虑到您分配给int而不使用强制转换,我希望这段代码能够编译,这意

我读过,但一件事不懂。假设我有一门课:

class MyClass
{
    public int Value { get; set; }
}
我想在我的方法中获得价值:

void MyFunc(MyClass cls)
{
    int i = cls.Value;
}
作为一个放在堆中的类,我猜这个值也放在堆中了吗?因此,操作

int i = cls.Value;

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

它既不是
拆箱
也不是
装箱
。 考虑到您分配给
int
而不使用强制转换,我希望这段代码能够编译,这意味着
cls.Value
是一种
整数(int)
类型。因此,将
int
分配给
int

这里发生的是一个值拷贝

装箱或取消装箱与在堆或堆栈上存储值无关。你应该读书。在您的示例中,这两种情况都不会发生,因为您将int赋值给int

int i = 5;
object o = i;   // boxing of int i
int i = (int)o; // unboxing of object o
请注意,我们没有将
i
指定给对象的字段或属性,而是指定给对象本身。 它与光的性质相当。光可以被认为是由粒子(光子)构成的,也可以被认为是波。
int
可以是
int
对象(引用类型)或
int
值类型。但是,您不能直接将
int
定义为引用类型;必须将其转换为对象,例如,将其分配给
对象
类型的变量、参数或属性,或将其强制转换为
对象
,使其成为引用类型。

停止考虑堆栈和堆;这是完全错误的想法。显然,“boxed”的意思不是“在堆上”,因此任何“在堆上”的东西都必须是“boxed”

堆栈和堆是不相关的。相反,要考虑引用和值必须将值类型的值视为对对象的引用时,会将其装箱。如果需要对值类型的值进行引用,请创建一个框,将值放入框中,然后对框进行引用。现在,您有了一个对value类型的值的引用


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

否,这不是取消装箱,因为您要从int字段转换为int局部变量。如果一边是引用类型,那么就是装箱/取消装箱,如果值是object类型,那么当我说“((object)123).ToString()”时,这不是装箱吗?因为赋值对象类型的变量、参数或属性在哪里?这个解释站不住脚。好吧,我忘了铸造!(我更改了文本)。好的,如果调用123.GetType()呢?GetType是在System.Object上定义的非虚拟方法,因此需要对Object的引用作为其“this”参数。这不是一个拳击比赛,因为没有任务或演员?你从错误的方向接近这个。拳击是一种转化形式。这就是这里最基本的内容。@EricLippert从什么到什么的转换?根据kvb对您的回答的评论,从CTS的角度来看,转换是从一个值类型到其“称为装箱类型的对应引用类型”。从这个角度来看,奥利弗的问题“什么类型的盒装int”的答案是“盒装int”。我想这不是一个很令人满意的答案。@phoog:从int到object的转换就是装箱转换。这是一种装箱转换,因为它分配了一个可以容纳int的箱子,并将int复制到箱子中。@OlivierJacot Descombes:我一点也不跟踪你。Int是一种值类型;没有int类。我怀疑您没有非常精确地推理对象具有类型意味着什么。装箱的int类型为int;一个非固定的int也是int型的。我有一只猫;她属于猫科动物。我把她放在一个盒子里,在地板上画了一个箭头指向盒子。她仍然属于猫科动物。盒装猫和未盒装猫都是猫;ints也是如此。我不明白你说的是什么。当一只乌贼和一只猫放在一个盒子里时,猫是活的,还是死的,或者两者都有?@IgbyLargeman:这是生物学的基本问题:当你把两个生物放在一个盒子里时,哪一个吃了另一个?虽然从C#的角度来看,没有“盒装类型”这可能是真的,请注意,从CLI的角度来看,存在以下问题(请参阅ECMA CLI规范分区I的第8.2.4节)。“对于每个值类型,CTS定义了一个对应的引用类型,称为装箱类型。”然而,“装箱类型不能通过名称直接引用,因此不能为字段或局部变量指定装箱类型。”是的,Igby,有一个神奇的unicorn类型。它确实存在,就像爱、慷慨和奉献存在一样,你知道它们丰富多彩,给你的生活带来了最高的美和欢乐。唉!如果没有神奇的独角兽,世界将多么沉闷!