在C#中class Process
继承自实现class Component
的{{1}},因此我可以在任何IDisposable
对象上调用Dispose()
。我真的需要吗?我怎么知道我是否真的需要?
假设我有以下代码:
Process
现在看起来我有一个 var allProcesses = System.Diagnostics.Process.GetProcesses();
var processesNames = processes.Select( p => p.ProcessName );
// output process names here
个对象数组,我已经设法Process
来遍历数组并try-finally
每个对象。这肯定是很多额外的代码。
Dispose()
对Dispose()
个对象做了什么?我是否真的需要Process
每个Dispose()
对象,我该如何决定是否需要这样做?
答案 0 :(得分:32)
我是否真的需要
Dispose()
每个Process
对象,我该如何决定是否需要这样做?
是的,你应该处理它们。请注意Process
的文档中的此文字:
系统进程由系统进程标识符唯一标识。与许多Windows资源一样,进程也由其句柄标识,该句柄在计算机上可能不是唯一的。句柄是资源标识符的通用术语。操作系统持久保存进程句柄,即使进程已退出,也可通过Process组件的Handle属性访问该句柄。因此,您可以获取进程的管理信息,例如ExitCode(通常为成功为零或非零错误代码)和ExitTime。手柄是非常有价值的资源,因此泄漏的手柄比泄漏记忆更具毒性。
因此,如果你没有Dispose
他们,你可能会泄漏句柄(直到他们被垃圾收集 - 但Dispose
的全部意义是允许尽早清理资源)< / p>
另请注意,相同的文档表明Process
会覆盖Dispose(bool)
- 另一个线索,即当Dispose
被调用时,它实际上会某些。
答案 1 :(得分:0)
:http://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.80).aspx
使用完Component后调用Dispose。 Dispose方法使Component处于不可用状态。 在调用Dispose之后,必须释放对Component的所有引用,以便垃圾回收器可以回收Component占用的内存。