定义了类Class1,代码如下所示: class Class1
{
private WebBrowser webBrowser = new WebBrowser(); public void method()
{
webBrowser.Name = "";
}
}编译时出现了下面的警告:“警告 1 CA1001 : Microsoft.Design : 在 'Class1' 上实现 IDisposable,因为它创建下列 IDisposable 类型的成员: 'WebBrowser'。 E:\Work\WindowsFormsApplication7\WindowsFormsApplication7\Class1.cs 9 WindowsFormsApplication7”
我知道,这个原因是没有释放webBrowser这个非托管资源。我该怎么写代码去释放它呢?
{
private WebBrowser webBrowser = new WebBrowser(); public void method()
{
webBrowser.Name = "";
}
}编译时出现了下面的警告:“警告 1 CA1001 : Microsoft.Design : 在 'Class1' 上实现 IDisposable,因为它创建下列 IDisposable 类型的成员: 'WebBrowser'。 E:\Work\WindowsFormsApplication7\WindowsFormsApplication7\Class1.cs 9 WindowsFormsApplication7”
我知道,这个原因是没有释放webBrowser这个非托管资源。我该怎么写代码去释放它呢?
class Class1:IDisposable
{
private WebBrowser webBrowser = new WebBrowser(); public void method()
{
webBrowser.Name = "";
} public void Dispose()
{
webBrowser .Dispose ();
}
}虽然不再有CA1001警告了,但是查看MSDN,了解到还需要考虑使用GC.SupressFinalize()方法、需要根据disposed属性做判断,以及需要考虑写析构函数~Class1()。
请高手能给解释下吗?最好能贴上代码,非常感谢!
{
bool disposed = false;
WebBrowser wb = new WebBrowser();
public void method()
{
wb.Name = "";
} public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(wb);//将非托管的wb从finalization请求队列中排除
//以防止GC重复回收
} private void Dispose(bool disposing)
{
if (!this.disposed)//Dispose()方法还没有调用过
{
if (disposing)
{
//在这里释放托管对象
}
wb.Dispose();//采取适当的方法释放非托管对象,我这里用的是dispose,
//根据不同的对象应该具体使用不同的方法
disposed = true;
}
}
~Class1()//模仿着写的析构函数,我没有想明白是为什么,疑惑大大的有!!!
{
Dispose(false);//在这里不要再写释放的代码。
//为了可读性和可维护性,微软建议只是调用Dispose(false)就OK了!
}
}在注释中写的是我对MSDN中描述的理解,看到英文头就大,不知道理解得对不对?这么写还有哪些不恰当的地方,盼高手指教、斧正!
另外还有一个疑问:~Class1()这里写个析构函数是干什么用的??既然要求用户代码中手动调用Dipose()方法,那么为什么还会需要写这个将会被自动调用的析构函数?
{
private bool disposed = false;
WebBrowser wb = new WebBrowser();
public void method()
{
wb.Name = "";
} public void Dispose()
{
Dispose(true);//调用带参数的Dispose方法,释放托管和非托管资源 GC.SuppressFinalize(wb);//手动调用了Dispose释放资源,那么析构函数就是不必要的了,这里阻止GC调用析构函数 } //protected的Dispose方法,保证不会被外部调用。传入bool值disposing以确定是否释放托管资源
protected void Dispose(bool disposing)
{
//
if (!disposed)
{
if (disposing)
{
//在这里释放托管对象;应该是xxx.Dispose();
}
wb.Dispose();//采取适当的方法释放非托管对象,我这里用的是dispose,
//根据不同的对象应该具体使用不同的方法
}
disposed = true;
} //供GC调用的析构函数
~Class1()
{
Dispose(false);//释放非托管资源 }
}
这么写是结合了析构函数和Dispose()的优点,逻辑有点复杂,其实很简单,如果你显示调用了Dispose()方法来清理资源,他会清理掉托管和未托管资源;如果你没调用Dispose(),垃圾回收器将调用析构函数,本来析构函数只能清除托管资源,但是在析构函数内部调用了Dispose(bool)方法,他就能清除掉托管和未托管资源。你重点理解下中间那个Dispose(bool)方法,把他的逻辑弄明白了,你也就搞清楚了。
再等下,等到明天,如果没人有不同意见了,就结贴。
呵呵,题外话了。