Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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#_.net_Garbage Collection - Fatal编程技术网

C# 当我完成一个类时,如何释放它的所有资源

C# 当我完成一个类时,如何释放它的所有资源,c#,.net,garbage-collection,C#,.net,Garbage Collection,当我处理完为类创建的对象后,如何在.net中调用GC 如果我将对象值设置为Null objClassObject=NULL; 它是否释放了所有与之相关的对象和资源 将对象设置为null不会导致GC突然进入并清理内存。这有助于首先了解您正在做什么,幸运的是,GC有很好的文档记录: 答案是99.999%的时间都是编造的,是的,你不需要。如果您已经分析并发现确实需要强制执行GC传递,则可以使用尝试执行此操作。但是,您确实应该知道自己在做什么,并且不能保证GC会完全按照您的要求来做 陈雷蒙最近就这一主

当我处理完为类创建的对象后,如何在.net中调用GC

如果我将对象值设置为Null

objClassObject=NULL;

它是否释放了所有与之相关的对象和资源

将对象设置为null不会导致GC突然进入并清理内存。这有助于首先了解您正在做什么,幸运的是,GC有很好的文档记录:

答案是99.999%的时间都是编造的,是的,你不需要。如果您已经分析并发现确实需要强制执行GC传递,则可以使用尝试执行此操作。但是,您确实应该知道自己在做什么,并且不能保证GC会完全按照您的要求来做

陈雷蒙最近就这一主题写了几篇好文章:


但是,如果您创建了一个管理某些本机资源的类,那么您将需要实现该接口,因为GC不会/无法回收非托管资源。

将对象设置为null不会导致GC突入并清理内存。这有助于首先了解您正在做什么,幸运的是,GC有很好的文档记录:

答案是99.999%的时间都是编造的,是的,你不需要。如果您已经分析并发现确实需要强制执行GC传递,则可以使用尝试执行此操作。但是,您确实应该知道自己在做什么,并且不能保证GC会完全按照您的要求来做

陈雷蒙最近就这一主题写了几篇好文章:


但是,如果您创建了一个管理某些本机资源的类,那么您将需要实现该接口,因为GC不会/无法回收非托管资源。

简短的回答是:GC.Collect。然而,正确的答案是您不应该关心GC的细节。让.NET为您管理对象。如果objClassObject超出范围,则它符合垃圾收集的条件,并且GC将确保为您收集它

简单的答案是:GC.Collect。然而,正确的答案是您不应该关心GC的细节。让.NET为您管理对象。如果objClassObject超出范围,则它符合垃圾收集的条件,并且GC将确保为您收集它

这是一个有管理的世界。在您的类具有非托管resurces之前,您不必担心它。在本例中,使用处置模式。

这是一个托管世界。在类具有非托管资源之前,您不必担心它。在本例中,使用处置模式。

GC本身只处理托管资源。因此,在这种情况下,如果没有非托管代码/资源,则在没有带有释放非托管资源的代码的终结器之前,不会释放它们。 还请注意,不需要将object设置为null,以便GC将清除该对象。GC可以检测到自己没有引用,并且不需要该对象,它将在下一个GC循环中被清除


至于调用GC,您可以使用GC.Collect,但强烈建议不要这样做,除非在某些极端情况下,因为它在调用时进行了优化

GC本身只处理托管资源。因此,在这种情况下,如果没有非托管代码/资源,则在没有带有释放非托管资源的代码的终结器之前,不会释放它们。 还请注意,不需要将object设置为null,以便GC将清除该对象。GC可以检测到自己没有引用,并且不需要该对象,它将在下一个GC循环中被清除


至于调用GC,您可以使用GC.Collect,但强烈建议不要这样做,除非在某些极端情况下,因为它在调用时进行了优化

@Ed:看了第二个链接。我有一个疑问。如果我有一个带有类对象的函数,该类对象具有一些引用,即非NULL。但是没有在任何地方使用。那么它是否符合GC的条件。如果同一个对象为NULL,即没有引用,GC会立即收集它吗?如果堆上有对该对象的引用,则没有,它不合格。您必须记住,您大部分时间都在使用引用的副本。@Ed:在阅读第二个链接之后。我有一个疑问。如果我有一个带有类对象的函数,该类对象具有一些引用,即非NULL。但是没有在任何地方使用。那么它是否符合GC的条件。如果同一个对象为NULL,即没有引用,GC会立即收集它吗?如果堆上有对该对象的引用,则没有,它不合格。你必须记住,你大部分时间都在使用参考资料的副本。