日期:2014-05-18  浏览次数:21005 次

非托管资源如何理解?
我们都知道如果是非托管资源是不被gc回收的,那么就需要我们自己重写析构函数,或者着实现IDispose接口,但是我们什么时候需要实现重写析构函数和实现IDispose接口,一般我们使用的非托管资源都已经实现了析构函数或者IDispose接口,比如SQLConnection,Font等,那还有什么需要我们自己来实现呢?

我们自己写的类,会是非托管资源么?我们能自定义非托管资源么?



------解决方案--------------------
你理解的没错。要释放的是.net无法管理的内存以及资源。比如文件操作的句柄,设备操作的句柄,GDI句柄等,这些应为.net已经封装过了。这些对应的类FileStream,SerialPort,Pen,SolidBrush等都实现了IDispose接口,会在垃圾回收的第一阶段执行Dispose的时候释放对系统核心资源的释放。

如果你也使用到了。而且又用的不是系统的类,就需要自己释放。或者不一定是核心资源。你的某个类,封装了一些非托管资源的操作,如果你调用的方法分配了内存,而非托管那边的释放是等你调用某个例如FreeVirtualMemory的方法来释放,那就需要你在类中实现IDispose或析构函数在必要时候释放资源。
------解决方案--------------------
探讨
引用:
可以用来避免忘记保存。

C# code
public class Document : IDispose
{
public void Dispose()
{
SaveDocument();//避免忘记保存。
}
}


这样不妥吧,既然是释放资源的方法,就不应该有其他的多余操作,这有反原则。

------解决方案--------------------
IDispose和Form的CLosed类比更合适。关闭窗口的时候你要做点什么事。这个是类在呗释放前要做点什么事,可以是释放,也可以是保存,或是对象计数器-1等。