Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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# 为什么在某些对象上需要Dispose()方法?为什么';垃圾收集器不做这项工作吗?_C#_Garbage Collection_Dispose - Fatal编程技术网

C# 为什么在某些对象上需要Dispose()方法?为什么';垃圾收集器不做这项工作吗?

C# 为什么在某些对象上需要Dispose()方法?为什么';垃圾收集器不做这项工作吗?,c#,garbage-collection,dispose,C#,Garbage Collection,Dispose,问题是:为什么我们需要对某些对象调用Dispose()?为什么垃圾收集器在对象超出范围时不收集它?我正在试图理解为什么它会这样实施。我的意思是,如果在垃圾收集器收集范围外对象时调用Dispose(),不是更容易吗。Dispose用于清理非托管资源(例如,数据库连接的包装器、旧COM库等) 编辑: 包含更多详细信息的一些MSDN链接: 要指定垃圾回收器回收对象时非托管资源的情况,必须重写protectedfinalize()方法: 垃圾收集器是不确定的-它在对象不再被引用后的某个时间点收集对象

问题是:为什么我们需要对某些对象调用
Dispose()
?为什么垃圾收集器在对象超出范围时不收集它?我正在试图理解为什么它会这样实施。我的意思是,如果在垃圾收集器收集范围外对象时调用
Dispose()
,不是更容易吗。

Dispose用于清理非托管资源(例如,数据库连接的包装器、旧COM库等)

编辑: 包含更多详细信息的一些MSDN链接:

要指定垃圾回收器回收对象时非托管资源的情况,必须重写protectedfinalize()方法:

垃圾收集器是不确定的-它在对象不再被引用后的某个时间点收集对象,但不能保证及时发生。与引用计数相比,这有各种好处,包括允许循环依赖性,以及不到处递增和递减计数器的性能好处


但是,这确实意味着对于应该及时清理的资源(例如数据库连接、文件句柄等,几乎是内存以外的任何东西),您仍然需要显式地处置资源。使用语句使这变得非常简单。

我有一个生成位图的应用程序,我没有调用dispose(),应用程序开始消耗千兆字节的内存。虽然我应该每20秒创建一个位图,它会立即保存到磁盘并超出范围。但垃圾收集器似乎根本不起作用。因为内存只会增加。@Karim:好吧,你当然应该处理掉那些位图。您必须查看地面军事系统正在发生的事情等,以诊断为什么它最终没有收集它们-但图像实现IDisposable是有原因的。。。