今天复习了一下C#基础知识,刚好看到了析构函数这里,有了进一步了解,记录一下,与君共勉
~类名()
{
//一些要释放的代码
}
“~”做前缀,加类名就构成了析构函数。
我们不能自己调用析构函数,它是在.NET垃圾收集过程中调用的。我简单测试了一些,在WinForm中简单调用类,当窗口关闭时,会调用这个类的析构函数。
我用想用到析构函数,是因为在处理过程中,要根据实际情况,在不同时期释放和建立新的对象。
按照MSDN上的话,如果你的代码中包含需要及时清理的非托管资源,别把它留给析构函数处理,因为不能保证析构函数会很快运行(.NET垃圾收集我们应该控制不了吧)。我们可以把资源的清理代码封装在一个VOID类型的无参数方法中,一般叫做Dispose。
例如我写的一个基类:
public class CSMOBasic
{
private bool disposed = false;
public CSMOBasic()
{
#region 构造代码
#endregion
}#region 析构函数,和清理函数
/// <summary>
/// 析构函数
/// </summary>
~CSMOBasic()
{
//
Dispose(false);
}public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}protected virtual void Dispose(bool disposing)
{
if (disposed == false)
{
if (disposing == true)
{
//
//释放非托管资源的代码
}
//
//释放托管资源的代码
}
disposed = true;
}#endregion
}
我们就可以在代码中根据需要调用Dispose函数释放非托管资源啦。
不过我没搞清楚 什么算托管资源,什么是非托管资源。
因为我要用到TcpClient,这个要根据需要手工释放,在概念上算不算 非托管资源???
我又写了派生类,析构函数和Dispose函数如下写法:
public class CSMOTest : CSMOBasic
{
private bool disposed = false;
//
public CSMOTest()
{
//
disposed = false;
}
//
#region 析构函数,和清理函数
~CSMOTest()
{
Dispose(false); //当派生类被执行析构函数时,会自动调用基类析构函数
}
new public void Dispose()//我是这么写的,不知道对不对,
{
Dispose(true);
GC.SuppressFinalize(this);
//
base.Dispose(); //这里要手工调用基类的Dispose函数,否则不会自动调用
}
new protected virtual void Dispose(bool disposing)
{
if (disposed == false)
{
if (disposing == true)
{
//_strLine = "000";
////释放非托管资源的代码
}
//_strLine = "000";
//释放托管资源的代码
}
disposed = true;
}
#endregion
}
哈哈,先记录到这里。