Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.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销毁尝试上_C#_Garbage Collection - Fatal编程技术网

C# 将对象保留在GC销毁尝试上

C# 将对象保留在GC销毁尝试上,c#,garbage-collection,C#,Garbage Collection,我是在思考回收物品的方法时产生这个想法的。我做这个实验是为了看看内存池是如何工作的,我意识到在99%的情况下这是非常不必要的 不过,我有一个问题。有没有办法强制GC保留该对象?换句话说,我能告诉GC不要破坏一个对象,而是说在一个列表中创建一个新的引用,该列表保存了可供使用的对象吗?问题是,尽管我没有对此进行测试,但如果我在列表中添加类似的内容: ~myObject() { ((List<myObject>)HttpContext.Current.Items[typeof(T

我是在思考回收物品的方法时产生这个想法的。我做这个实验是为了看看内存池是如何工作的,我意识到在99%的情况下这是非常不必要的

不过,我有一个问题。有没有办法强制GC保留该对象?换句话说,我能告诉GC不要破坏一个对象,而是说在一个列表中创建一个新的引用,该列表保存了可供使用的对象吗?问题是,尽管我没有对此进行测试,但如果我在列表中添加类似的内容:

~myObject()
{
     ((List<myObject>)HttpContext.Current.Items[typeof(T).ToString()]).add(this);//Lets assume this is ASP
}
~myObject()
{
((List)HttpContext.Current.Items[typeof(T).ToString()).add(this);//假设这是ASP
}
它会将指向该对象的指针添加到列表中,但是如果该对象被销毁,我将得到一个空指针异常,因为该对象不再存在。但是,也许我可以告诉GC不要收集这个项目,从而保留这个对象


我知道大多数程序员都会问“你到底为什么要这么做?”。但另一方面,编程是关于尝试新事物和学习新事物。有什么建议、想法和实施方案吗?任何帮助都将不胜感激

无论是否超出显式释放的范围,GC都只会处理引用消失的对象


无论是哪种方式,您都希望查看防止GC垃圾收集对象的方法和步骤。一旦你真的完成了它们,你就需要注册它们,让收藏家用它来收集。

是的,这是可能的,它甚至有一个名字:复活

但是如果该对象被销毁,我将得到一个空指针异常,因为该对象不再存在

更糟糕的是,您会得到一个无效的指针(引用)错误。可能是蓝屏或服务器崩溃。但幸运的是,CLR不会让这种情况发生。简单地将一个注定失败的实例放在任何类型的列表中都会使它再次可访问,然后它就不会被回收

当您希望对象被多次回收时,必须对其调用
GC.ReRegisterForFinalize(x)


但最实际的答案是:不要这样做。析构函数本身就占了相当大的开销,而且有很多方法会出错。

是的,这是合法的。这叫做“复活”。当您将
引用指定给“活动”的某个位置时,对象不再被视为垃圾

您还需要使用重新注册以进行终结,否则下次对象变成垃圾时,它将不会被终结(不会调用析构函数)


您可以在中阅读有关对象复活的更多信息。

SuppressFinalize仅取消运行析构函数,而不是集合。KeepAlive更好,但你必须把它叫做某个地方,而不是实际的。