对象类型变量是引用吗?它是什么?或者它也可以参考参考?

时间:2015-09-26 15:57:10

标签: c# memory-management reference boxing object-type

大家好,我在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;
是不是

.........

提前谢谢你们。

2 个答案:

答案 0 :(得分:2)

参考类型未加框。您将从一个变量分配给另一个变量。发生的唯一复制是引用(通常作为指针实现)。对象中的数据不会被复制,但仍保留在原处。

关于价值类型,你或多或少是正确的。

我建议你不要考虑堆和堆栈。它们是实现细节。而且,值类型总是存在于堆栈中并不是真的。相反,您应该根据复制语义来考虑它。始终复制值类型,而不复制引用类型。这就是它的全部内容。

编辑:我重读了你的问题,试图了解你真正的问题,所以我可以更清楚地回答。

Xstring类型的局部变量,它包含对类型为string的对象的引用。 Yobject类型的局部变量,它包含对类型为string的对象的引用。这是允许的,因为string派生自object,并且变量可以安全地包含对其自身类型的对象的引用,或者该类型派生的任何类型(类或接口)。 Zobject类型的局部变量,其中包含对类型为string的对象的引用。它在功能上与X相同。您只需要两个包含对同一对象的引用的变量。没有额外的引用发生。

我认为您可能会感到困惑,因为您可能认为在分配期间发生了引用的创建。所有赋值都是复制引用(对于引用类型)并复制值(对于值类型)。您只能在方法参数中使用ref关键字创建对引用的引用。

字符串文字增加了皱纹。它们存储在全局表中,每个唯一字符串文字一个条目。如果将相同的字符串文字分配给两个变量,它们都将指向(即引用)该全局表中的相同条目。这与使用new两次不同,但类似于在语义上初始化具有相同值的两个int变量。

答案 1 :(得分:1)

拳击时,按值复制

ab是指a的盒装值。 ab是独立的。

第二个例子也是如此,但没有拳击。复制参考。

C#中的赋值始终复制值或引用。它永远不会创建对存储位置的引用。

  

它会在堆栈中引用堆中的字符串文本数据,或者它会在堆栈中引用堆中的另一个引用到字符串文本的数据

没有。 C#中的对象引用始终指向一个对象,而不是另一个引用。没有引用链。