调用Dispose不会清理对象C#使用的内存?

调用Dispose不会清理对象C#使用的内存?,c#,garbage-collection,C#,Garbage Collection,一位gut告诉我Dispose是用来运行用户定义的代码,这些代码释放的资源不是自动释放的,比如文件句柄、网络句柄、数据库连接等等 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); 他还说 注意,.NET垃圾收集器非常不可预测,它可能会在清理所有符合收集条件的旧实例之前创建一些对象实例。一种确定的方法(无需求助于内存分析器)是在终结器中放置一个断点 我通过上面的GC相关代码释放内存并收集所有无人认领的对象或对象超出范围 他还说,

一位gut告诉我Dispose是用来运行用户定义的代码,这些代码释放的资源不是自动释放的,比如文件句柄、网络句柄、数据库连接等等

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
他还说 注意,.NET垃圾收集器非常不可预测,它可能会在清理所有符合收集条件的旧实例之前创建一些对象实例。一种确定的方法(无需求助于内存分析器)是在终结器中放置一个断点

我通过上面的GC相关代码释放内存并收集所有无人认领的对象或对象超出范围

他还说,在生产环境中永远不要使用上面的GC相关代码,但没有解释原因……那么告诉我,如果有人使用下面的GC相关代码
GC.Collect(),会有什么危害
GC.WaitForPendingFinalizers();GC.Collect()


无论如何,我在寻找深入的知识。感谢

GC
在终结器中手动执行后,不要调用
Dispose
方法

GC
的工作流程非常简单,但是很多人会感到困惑,让我们把事情放在他们的位置上

Dispose
GC
无关
Dispose
是一种方法,在interface
IDisposable
中定义,与其他接口一样,类可以实现该方法并允许用户调用该方法。GC根本不注意这个接口。 一旦我们在.NET中有了自动内存管理,并且我们知道GC的工作做得很好,并且它会自动清除所有托管资源,因此没有理由提供user
Dispose
方法来清除托管资源。因此,通常Dispose用于清除非托管资源,但没有人阻止您取消订阅全局事件(例如)或为嵌套对象调用Dispose(注意,全局事件几乎总是不好的做法:)

另一方面,
GC
知道
Finalizer
,如果
Finalizer
存在
GC
将对象处理推迟到下一个集合,并在清除内存之前调用
Finalizer
。为了将处置代码放在一个地方,程序员通常创建
Dispose(bool)
,并从
Finalizer
IDisposable.Dispose
方法调用此方法。在这里,您需要注意,如果调用来自终结器,则不允许您访问托管资源,因为GC不保证任何处置顺序,并且资源可能已经处于无效状态。这就是所谓的


关于生产中的GC调用,是的,不建议这样做,因为一般来说,GC的工作做得很好,而且由于GC.Collect是一项昂贵的操作,在我们决定进行自动收集之前,没有理由麻烦GC引擎。

TL;DR:因为拥有一个自动管理内存的运行时的全部意义就是不必这样做。如果你想接手,你最好清楚自己在做什么,因为几乎可以肯定你会让事情变得更糟。如果你不确定自己在做什么,千万不要单独使用GC。孩子们不允许玩火:)Dispose()和GC.Collect()在很大程度上是不相关的。所以我理解人们不应该使用它,而是想知道人们何时使用GC.Collect();和GC.WaitForPendingFinalizers();thanks@Jon同意。但是,在处理内存不足的应用程序时,这不是一个好的理念,在这些应用程序中,您可能希望最小化GC运行等。了解某些东西的工作原理与知道不要弄乱它一样重要:谢谢回复。你说GC.Collect是一种昂贵的操作。贵的时候能解释一下吗?谢天谢地,它从自己的线程开始,使用处理器时间和计算机内存,分析对象图,停止使用这个或那个些对象引用的线程,调用终结器等等。同意,在.net中,GC非常快,但GC对性能没有影响。我记得,在.NET2和.NET1.1中,WinForm应用程序会在短时间内(实际上不到一秒钟)不时停止响应,这就是原因。在以后的版本中,确实,影响不明显,但也不是0。