大家好,我在C#学习拳击和拆箱概念时遇到了一个快速的问题(封闭式问题):
"对象的变量" type是一个引用类型变量,可以获取值类型变量或引用类型变量的副本。
让我们考虑在堆栈中声明的对象类型变量。
首先,它会获取值类型变量的副本:
int a;
object b = a;
其次,它会获取一个引用类型变量的副本:
string c;
object d = c;
现在的问题是:与第一个对象类型变量(对象b)相比,它在堆栈中使用堆中的int-type数据在内存中表示,第二个对象类型变量(对象d)它会在堆栈中引用堆中的字符串文本数据,或者它会在堆栈中引用堆中的另一个引用到字符串文本的数据吗?
换句话说:
string X = "ABC";
等于:
object Y = "ABC";
或其中之一:
object Z = X;
是不是
.........
提前谢谢你们。
答案 0 :(得分:2)
参考类型未加框。您将从一个变量分配给另一个变量。发生的唯一复制是引用(通常作为指针实现)。对象中的数据不会被复制,但仍保留在原处。
关于价值类型,你或多或少是正确的。
我建议你不要考虑堆和堆栈。它们是实现细节。而且,值类型总是存在于堆栈中并不是真的。相反,您应该根据复制语义来考虑它。始终复制值类型,而不复制引用类型。这就是它的全部内容。
编辑:我重读了你的问题,试图了解你真正的问题,所以我可以更清楚地回答。
X
是string
类型的局部变量,它包含对类型为string
的对象的引用。 Y
是object
类型的局部变量,它包含对类型为string
的对象的引用。这是允许的,因为string
派生自object
,并且变量可以安全地包含对其自身类型的对象的引用,或者该类型派生的任何类型(类或接口)。 Z
是object
类型的局部变量,其中包含对类型为string
的对象的引用。它在功能上与X
相同。您只需要两个包含对同一对象的引用的变量。没有额外的引用发生。
我认为您可能会感到困惑,因为您可能认为在分配期间发生了引用的创建。所有赋值都是复制引用(对于引用类型)并复制值(对于值类型)。您只能在方法参数中使用ref
关键字创建对引用的引用。
字符串文字增加了皱纹。它们存储在全局表中,每个唯一字符串文字一个条目。如果将相同的字符串文字分配给两个变量,它们都将指向(即引用)该全局表中的相同条目。这与使用new
两次不同,但类似于在语义上初始化具有相同值的两个int
变量。
答案 1 :(得分:1)
a
。 b
是指a
的盒装值。 a
和b
是独立的。
第二个例子也是如此,但没有拳击。复制参考。
C#中的赋值始终复制值或引用。它永远不会创建对存储位置的引用。
它会在堆栈中引用堆中的字符串文本数据,或者它会在堆栈中引用堆中的另一个引用到字符串文本的数据
没有。 C#中的对象引用始终指向一个对象,而不是另一个引用。没有引用链。