Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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# GC如何在.net平台上处理这个问题?_C#_.net_Clr - Fatal编程技术网

C# GC如何在.net平台上处理这个问题?

C# GC如何在.net平台上处理这个问题?,c#,.net,clr,C#,.net,Clr,我有这个密码 classObject var1 = new classObject(); classObject var2 = var1; 现在,我写道: var1 = null; GC将如何处理此问题? GC是否将收集该类对象的实例 如果我写var2=null,GC将如何解决这个问题? (并从代码中删除var1=null)否,因为在var2中仍然有对对象的实时引用。如果var1和var2都为空,则它将符合收集条件(假设不存在其他引用)。您仍然有对对象的引用(var2) 这完全取决于上

我有这个密码

 classObject var1 = new classObject();
 classObject var2 = var1;
现在,我写道:

 var1 = null;
GC将如何处理此问题?
GC是否将收集该类对象的实例

如果我写var2=null,GC将如何解决这个问题?
(并从代码中删除var1=null)

否,因为在
var2
中仍然有对对象的实时引用。如果
var1
var2
都为空,则它将符合收集条件(假设不存在其他引用)。

您仍然有对对象的引用(
var2

这完全取决于上下文

即使您仍然有对对象的引用,GC也可以收集对象(如果它确定在代码中不再使用该对象)

有趣的阅读:

使现代化 对我来说,这听起来像是混淆了值类型和引用类型。指定变量时,不是将实际对象指定给它,而是一个引用。如果某个变量在某个地方有对它的引用,那么GC(大多数时候)不会收集对象


这里有一篇文章显示了两者的区别:

您只是将指针
var1
设置为
null
var2
仍然指向
classObject
,因此在至少有一个对
classObject
的引用处于活动状态之前,no
GC
不会收集
classObject
,因为var2仍然引用实例。只要至少有一个对象引用,就不会收集该对象

更详细的回答:实际上,在这个例子中可能会这样,因为您没有继续使用var2做任何事情。GC考虑了变量活性。如果在代码中不再使用var2,那么在最后一行代码之后,var2将被视为不活动。因此,这样的引用对于垃圾收集来说是没有意义的——就好像var2已经不存在了。因此,事实上,该对象将符合收集条件:

其他微妙之处:这还取决于您是在调试模式下运行还是在发布模式下运行。调试时,.NET人为地扩展变量的活动性,以扩展到其词法范围的末尾,这样您就有机会检查局部变量。当然,只有在GC实际运行时才会收集对象


所以严格地说,实际上不可能给出普遍正确的答案。

垃圾收集通过查看堆栈来确定堆上的对象是否具有活动引用。如果堆栈未引用堆上的对象,则该对象有资格进行垃圾收集


您可以随意多次重新分配引用,只要对象可以从堆栈访问,它就不会被垃圾收集

这一定是复制品。关于stackoverflow有很多问题,关于GC如何工作以及GC如何知道某个对象何时是垃圾。我知道根集合。但是我还有一些问题。。这不是重复的问题!“GC是否将收集此类对象的实例?”。当GC有缺陷时,它会有很大的缺陷;(没有写入var1=null;)这是一样的,因为现在引用仍然保存在
var1
中,这是GC特性还是编译器opto?如果对象不再使用,我希望编译器消除它,但是GC?真的吗?@spender:我认为这是一个JIT优化问题。GC只是查看堆栈中的引用。JIT可能会以这样的方式优化一个方法:堆栈位置被重用,在这种情况下,对象就可以被收集。@Spender:阅读这个问题的答案:GC甚至比这更聪明。如果它能确定引用不再被使用,它可能会在仍然存在引用的情况下收集。我希望编译器会处理这个问题,不?不,GC会处理它。阅读我在回答中链接到的文章。好吧。。。是与否。。。这取决于上下文和代码的编写方式。。。如果您只有操作码,那么是的,编译器应该处理它。。。如果您有一些对象声明,并且运行了一个很长的计算(不使用引用),然后是一个空赋值,那么GC应该启动引用,而不是编译器。。。但这是一个复杂的过程,在每种情况下,确定是否是GC或编译器将执行optmimization(如果有)…这是一个有用且详细的答案,+1