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