对象类型变量是引用吗?或者它也可以是引用到引用的引用
本文关键字:引用 也可以 类型变量 对象 或者 | 更新日期: 2023-09-27 18:14:43
你好,我在学习c#中的装箱和拆箱概念时遇到了一个快速的问题(封闭式问题):
object类型的变量是引用类型变量,可以是值类型变量或引用类型变量的副本。
让我们考虑在堆栈中声明的对象类型变量。
首先,它取一个值类型变量的副本:
int a;
object b = a;
其次它取了一个引用类型变量的拷贝:
string c;
object d = c;
现在的问题是:相对于第一个type变量(对象b)它是在引用的内存堆栈的数据int-type堆中,第二个type变量(对象d)会在堆栈的数据引用字符串文本在堆中还是会在堆栈的引用到另一个堆中引用的数据字符串文本吗?
也就是说:
string X = "ABC";
=:
object Y = "ABC";
或者:
object Z = X;
是否.........
提前感谢大家
引用类型没有框。您将把一个变量的引用赋值给另一个变量。唯一发生的复制是引用(通常作为指针实现)。对象中的数据不会被复制,而是保持在原来的位置。
关于值类型,你或多或少是正确的。
我建议你不要考虑堆和堆栈。它们是实现细节。此外,值类型并不总是存在于堆栈中。相反,您应该从复制语义的角度来考虑它。值类型总是被复制,而引用类型则不会。这就是它的全部。
编辑:我重读了你的问题,试图理解你真正问的是什么,所以我可以更清楚地回答。 X
是string
类型的局部变量,包含对string
类型对象的引用。Y
是object
类型的局部变量,包含对string
类型对象的引用。这是允许的,因为string
派生自object
,并且变量可以安全地包含对其自身类型的对象的引用,或者该类型派生的任何类型(类或接口)。Z
是object
类型的局部变量,它包含对string
类型对象的引用。功能与X
相同。您只需拥有两个变量,它们包含对同一对象的引用。没有额外的引用发生。
我想你可能会感到困惑,因为你可能认为引用的创建发生在赋值过程中。赋值所做的只是复制引用(对于引用类型)和复制值(对于值类型)。只能在方法参数中使用ref
关键字创建对引用的引用。
字符串字面值有一个额外的问题。它们存储在一个全局表中,每个唯一字符串字面值一个条目。如果你将相同的字符串字面值赋给两个变量,它们将指向(即引用)该全局表中的相同条目。这与两次使用new
不同,但在语义上类似于初始化两个具有相同值的int
变量。
a
在装箱时按值复制。b
为"a
"的装箱值。a
和b
是独立的
第二个例子也是如此,但是没有装箱。复制引用
c#中的赋值总是复制值或引用。它从不创建对存储位置的引用。是否在堆栈中有对堆中字符串文本数据的引用,或者在堆栈中有对堆中字符串文本数据的另一个引用
这些都不是。c#中的对象引用总是指向一个对象,而不是指向另一个引用。引用链是不存在的