Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 定义';参考';对一个物体_C# - Fatal编程技术网

C# 定义';参考';对一个物体

C# 定义';参考';对一个物体,c#,C#,创建对象时,将返回引用,而不是对象 这是什么意思 object a = new object(); 此处a保存引用 如果有人解释对象的创建、引用的创建,这将很有帮助。以下语句: object a = new object(); 实际上做了两件不同的事情 首先,新对象()分配必要的内存来存储在堆上分配的实例,并返回刚刚分配的堆上的地址 其次对赋值进行评估,并将从new返回的值赋值给a 当你说“a持有一个引用”时,它意味着a是堆栈上的内存(或寄存器中的内存,或堆上的内存,不取决于引用的生存期),

创建对象时,将返回引用,而不是对象

这是什么意思

object a = new object();
此处
a
保存引用


如果有人解释对象的创建、引用的创建,这将很有帮助。

以下语句:

object a = new object();
实际上做了两件不同的事情

首先
新对象()
分配必要的内存来存储在堆上分配的实例,并返回刚刚分配的堆上的地址

其次对赋值进行评估,并将从
new
返回的值赋值给
a


当你说“a持有一个引用”时,它意味着a是堆栈上的内存(或寄存器中的内存,或堆上的内存,不取决于引用的生存期),它指向你刚刚创建的实例的堆位置。

我认为引用就像是一组到达房子的方向,房子代表物体本身的地方

因此,如果你要告诉某人如何到达你的家,你可以在一张纸上写下这些指示并交给他们——这就像给一个变量指定一个引用

来举个例子:

object a = new object();
这就像建造一座新房子(调用构造函数),然后在一张纸上(变量
a
)写下到达新房子的方向。报纸上没有房子本身,只有方向。如果有人复制了这张纸的内容,如下所示:

object b = a;
这不会创造第二个房子。它只是将方向从一张纸
a
复制到一张纸
b
。同样地,这两张纸是独立的-您可以将
a
的值更改为一组不同的方向,而不会更改
b
上的内容


我对此有一个解释,它试图以另一种方式解释它,这可能会对您有所帮助。

当您使用
new
关键字实例化一个类时,您会在堆上创建一个对象。它还没有被任何人引用。如果一个对象本身没有引用,它很快就会被垃圾回收。要使用对象进行操作,您需要引用它。因此,您可以创建一个包含对象地址(引用)的变量。

对于大多数现代语言,您不必担心引用与对象本身的关系。回到过去(例如c++),您必须担心引用(有时称为指针)甚至分配给它们的内存。现在,系统(以及所谓的垃圾收集器)为您担心它

详情如下。您的示例行表示以下内容:

1) allocate memory for object

2) run the constructor

3) put the memory location of that object in the variable "a"
作为一名程序员,这对你在概念上意味着什么?大多数时候不多。在C#中,您仍然可以将变量a视为对象。你不必担心它指向引擎盖下的物体。大多数情况下,这并不重要

重要的是何时需要关注对象的生命周期。因为您有一个对对象的引用,所以它不会被解除分配,这意味着如果它正在使用系统资源,它将继续这样做


当一个对象不再被引用时,它将被垃圾回收器释放。

另一个与堆类似的玩笑:该对象是一个氦气球,而引用是一个绑在你拿着的气球上的字符串。说
newobject()
相当于在展会(你的程序)上向气球人(内存管理器)索要一个新气球。他可能会通过给你绳子的方式给你一个气球,也可能会告诉你已经没有气球了。你可能会发现后者很烦人,哭着跑出集市

你可能希望与你的兄弟姐妹分享这个气球,而这里的类比开始瓦解。这可以被看作是你和你的兄弟姐妹用手抓住同一根绳子,或者第二根绳子被拴在你兄弟姐妹的气球上。必须注意确保那些拿着绑在气球上的绳子的人协调他们的动作,否则气球可能会被撕裂或毁坏

最后,在像C#这样的语言中,当你对气球感到厌烦时,你可以简单地放开字符串。如果其他人仍然拿着绳子,它将不会去任何地方,但如果他们没有,它将无害地漂浮在空中的一张网中,气球人定期从网中收集释放的气球以补充库存。在其他较古老的语言如C语言中,没有这样的网络,气球人将永远无法回收气球中的氦来为其他人制造另一个气球。如果你把气球拿回来,他会非常感激的。这会导致其他问题:你可以归还气球,但忘记你的兄弟姐妹仍然想要它。当他们转身时,他们不会注意到你从他们手中拔出绳子,后来当他们转身寻找绳子时,他们会发现绳子不见了,非常不安


荒谬的类比?对它会留在你的脑海里吗?最有可能的是:C++引用中的

是内部指针,指针保存的地址不是数据,所以在C中它是相似的。way@Raghav:未定义“方向”的确切形式。任何能让你找到目标的方法。指针是一个显而易见的实现,虽然它适用于.NET的“标准”实现,但不应该使用“堆栈”和“堆”这两个词。你的回答变了吗?早期的u使用堆栈和heap@Raghav-我根据埃里克·利珀特(Eric Lippert)的博文(xanatos链接的博文)将其更新为正确。虽然引用通常存储在堆栈上,但它们不需要存储。它们可以存储在基于对象生命周期列出的任何机制中。基本概念是相同的(并且,正如文章提到的,它实际上与引用存储在哪里无关,因为开发人员不需要担心