我有许多类具有实现IDisposable(定时器,画笔等)的私有成员变量.我是否需要做任何事情以确保.NET Framework正确清理这些变量?
我遇到的文献是指"托管资源"与"非托管资源".这些术语让我感到困惑,因为您可以拥有一个使用非托管资源实现功能的托管类.这被认为是"非托管资源"还是"托管资源"?
我的理解是,如果您没有在实现IDisposable的对象上调用Dispose(),那么在应用程序退出之前不会释放资源.在长时间运行程序时,这种情况可能会导致OutOfMemory异常.
如何确保我的代码正确处理资源管理?这对于这些对象很重要,因为它们是自定义控件,并且可能有很多绘图消耗了IDisposable资源.我尽可能使用C#using语句,但有时我需要使一个对象实现IDisposable成员变量,而using语句对我没有帮助.
是的 - 如果你的班级"包含"一个IDisposable,那个班级几乎肯定IDisposable也应该实现.
"托管"资源基本上都是内存."非托管"资源可以是文件句柄,网络连接,图形对象的句柄等.在大多数情况下,可以直接访问本机句柄的类型具有终结器,因此资源将在某个时候发布,但最好还是明确地释放它- 在某些情况下(例如with HttpWebResponse),可以使用有限数量的此类资源(在这种情况下连接池中连接到单个主机)并且您最终可以等待释放"死"资源.
在可能的情况下,最好不要首先拥有这样的类成员 - 将它们作为局部变量的方法参数等,这样您就可以使用它们然后关闭它们,而不会将资源的生命周期与对象的生命周期联系起来.但是,在某些情况下这是不合适的 - 在这种情况下你应该实施IDisposable.
托管资源是任何实现的东西IDisposable.非托管资源就像是HANDLE通过p/Invoke获得的资源.类似SafeHandle(或派生自的类SafeHandle)拥有非托管资源,但它本身被视为托管资源.因此,拥有非托管资源的任何类本身都是托管资源.
由于您拥有拥有托管资源的类,请遵循规则2:实现IDisposable(但不是终结器).
IDisposable允许更早的清理.如果你没有打电话,那么无论如何都会清理资源(在进程退出之前它们不会挂起); 它们将在以后清理干净,而且你无法选择何时清理它们.