最近我接手了一个使用.NET Compact Framework编写的移动设备代码库,我发现代码中到处都是Dispose()
调用。
这似乎是在
- ADO.NET数据库命令
- Windows窗体
我以为垃圾回收器会处理内存管理。我知道如果没有Dispose()
,它们可能会在内存中挂起更长时间,但是有这些调用是否有很大的优势或收益?它似乎会破坏代码的整洁性。
最近我接手了一个使用.NET Compact Framework编写的移动设备代码库,我发现代码中到处都是Dispose()
调用。
这似乎是在
我以为垃圾回收器会处理内存管理。我知道如果没有Dispose()
,它们可能会在内存中挂起更长时间,但是有这些调用是否有很大的优势或收益?它似乎会破坏代码的整洁性。
Form
示例是要认识到它内部可能正在执行 Win32 API 调用并保持指向代表窗口等内存位置的指针... 这些东西是非托管的,因此需要释放。 IDisposable
接口提供了一种确保 GC
在清理托管对象时运行正确代码以释放非托管资源的方法。 - Jeff BDispose
是为了释放资源。未在所有引用被丢弃之前 Dispose
的托管资源通常会被 最终 释放,但除非所涉及的资源是可替代和充足的,否则这种释放可能不总是及时到足以有用。虽然有时候不需要(或者对于一些设计不良的类来说不能)使用 Dispose
,但除非有充分的理由不使用 Dispose
,否则应该始终使用 Dispose
。 - supercat.NET 在 IDisposable
对象上调用 Dispose()
方法...即当 GC
清理托管 IDisposable
对象时,它会调用 Dispose()
来清理对象使用的任何非托管资源...在这种情况下,调用 Dispose()
的主要作用似乎是更确定地释放非托管资源(因为 .NET 不使用引用计数器,一个无法访问的对象仍然可能存在并且正在使用内存,反之亦然,一个对象可能已被处理但仍可访问)。
using
而不是手动释放。使用using
的主要优点是,即使出现异常情况,也可以保证释放资源。您可以堆叠using
语句并仅创建一个块,因此它的大小与普通声明相差无几。 - Reed Copsey