在写.net程序时通常会遇到如何正确来释放资源,执行析构函数来提高用户程序的性能,虽然。NET有GC功能,但能做好即时手工来释放资源是很值的做的一件事情,不用等到GC的策略来调用回收机制,有可能会销毁非托管资源,如SqlConnection,那对我们又要重新来生成非托管资源了。
以下代码在VS2005通过
下面的代码是一个支持Dispose的类,把它放在app_code里,注意要引用System.web组件
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/// <summary>
/// Summary description for DisposeClass
/// </summary>
public class DisposeClass : IDisposable
{
public DisposeClass()
{
}
/**/
/// <summary>
/// 该对象是否已被销毁过
/// </summary>
private bool disposed;
/**/
/// <summary>
/// Finalize函数
/// </summary>
~DisposeClass()
{
//这个析构方法是当用户退出App时,他会自动清除
System.Web.HttpContext.Current.Response.Write("对象被销毁<br>");
//清理托管资源
Dispose(false);
}
//清理托管资源和非托管资源的代码位置不要写反了
//否则当一个托管对象已经被GC回收后,
//再去调用它的Dispose 方法, 系统会触发一个 ObjectDisposedException 异常
public void Dispose()
{
/*清理非托管资源
* */
System.Web.HttpContext.Current.Response.Write("手动销毁对象<br>");
Dispose(true);
//通知GC, 偶已经被销毁过了,可以不用在管偶了。。。
GC.SuppressFinalize(this);
}
/// <summary>
/// Releases unmanaged and - optionally - managed resources
/// </summary>
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
//该函数为手动调用,此处可进行托管资源的清理
}
//进行非托管资源的清理
}
disposed = true;
}
}
调用:
随便建一个page
放一个button来执行调用
protected void Button1_Click(object sender, EventArgs e)
{
//手工释放1
DisposeClass testClass1 = new DisposeClass();
testClass1.Dispose();
//手工释放2
using( DisposeClass testClass2 = new DisposeClass())
{
Response.Write("过了这个using的生命周期自动会调用Dispose<br>");
}
}
如何让程序执行析构方法~DisposeClass(),在windows测试是在你离开当前窗体或关闭App时,会去调用这个析构方法,但在web上不知道如何测,有知道的可以告诉我,谢谢。
因为懂得所以慈爱
Leung