区分:
托管资源是指受 .NET垃圾回收器(GC)管理的资源
非托管资源是指不受.NET垃圾回收器 (GC)管理的资源
属于非托管资源的:
文件句柄,如:FileStream、StreamReader、StreamWritert
数据库连接,如:SqlConnection
网络套接字,如:Scoket、 TcpClient
外部进程和线程,如:Process、Thread
图形资源,如:Bitmap、Pen、Graphics
内存映射文件,如:MenoryMappedFile
Windows句柄:Windows API调用产生的句柄,如:xxHandle
COM对象:与外部系统(如Excel)交互时,COM对象需要使 Marshal.ReleaseComObject
来显式释放
硬件资源:与外部硬件设备的交互,需要手动释放,如:SerialPort。
释放方法:
using: using是处理非托管资源的一种简便方式,它能确保对象在使用后被正确释放
using的对象必须实现IDisopsable接口(包含Dispose方法),自动调用dispose释放资源
using (FileStream stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
workbook.Write(stream);
}
public class FileStream : Stream //FIleStream继承自Stream
public abstract class Stream : MarshalByRefObject, IDisposable //Stream 实现了 IDisposable方法
GC.Collect()/GC.WatiForPendingFinalizers():是一种强制触发垃圾回收的方法,用于让GC清理所有的未托管资源和对象。但是,垃圾回收的时机由系统决定,它不会立即清理对象
*如果可以的话,优先使用using释放。而不是依赖GC