本次主要对文件托管资源的终结进行一些学习记录
一般情况下在c#中系统对托管资源都不建议进行人工进行托管、非托管资源的终结(Finalize),但当系统中出现需要人 工进行手工资源释放时,如:文件、网络连接、套接字、互斥体时,需要进行人工的资源释放,这时就需要进行对非托管资源进行手动资源的释放。为了更好在资源释放过程中不出现错误,,Net.Framework通过一个接口文件IDispose内不同的方法:Dispose()与Close()实现了接口重载较好的解决了问题,如下图:
参考代码如下:
using System;
namespace 析构3
{
public class MySoure : IDisposable
{
public bool Disposed = false;
public void Dispose()
{
Dispose(true);
}
public void Close()
{
Dispose(true);
}
~MySoure()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (!Disposed)
{
if (disposing)
{
Console.WriteLine("调用类所引用对象的Dispose()方法");
GC.SuppressFinalize(this);//终结类本身的Finalizer方法。
}
Console.WriteLine("调用类本身所使用的非托管资源");
}
Disposed =true;
}
}
class Program
{
static void Main(string[] args)
{
MySoure mr = new MySoure();
//1、什么也不输入时,执行类Mysoure内部的~Mysoure析构方法,CLR会通过Finalizer自动释放系统托管资源。
//输出结果为:"调用类本身所使用的非托管资源"
//2、当执行下列语句时,执行类Mysoure内部的的Close()方法与Dispose()方法。
输出结果为:"调用类所引用对象的Dispose()方法"
// "调用类本身所使用的非托管资源"
// mr.Close(); //人工终结
//mr.Dispose();//人工终结
}
}
}