Dispose方法和 析构函数 的区别:
(1)首先要明白一个原则:资源在哪个类中被创建就应该在哪个类中清理。如果类中调用了其他基类中创建的资源,则应在基类中删除这些资源。然后看以下内容。
(2)析构函数: 析构函数是由垃圾回收器在清理对象时调用的。 因为.NET中的托管对象都是由垃圾回收器自动定期清理的,
所以如果一个类中只有托管对象,则垃圾回收器在回收该对象时会同时一次性清理掉该类中创建的托管对象,此种情况下不要编写析构函数(情况A)。 如果一个类中创建使用了非托管资源(如数据库连接)(情况B),此时应该使用析构函数,
但也只是作为忘记调用Dispose()函数的一种备份机制。换言之,此时,应该先掉用Dispose()函数来删除资源。
(3)Dispose()函数: Dispose()函数由用户来调用。 在上面的情况A中,可以不调用Dispose()函数。但如果类中创建使用过一些较大的托管对象,最好尽快清除它们,此时可以在Dispose函数中删除它们,并由用户调用以尽快删除它们。 在情况B中,应该在Dispose()中删除非托管资源,并由用户调用Dispose()。此时,为防止垃圾回收器再次调用析构函数,应该在Dispose()中调用GC.SuppressFinalize(this)通知垃圾回收器,此对象已经不再需要执行析构函数以免重复执行。但如果用户忘记了调用Dispose(),则垃圾回收器仍然会执行析构函数,保证非托管资源会被清除。
示例:
/// <summary>
/// 释放当前对象所占用的非托管资源。
/// </summary>
public void Dispose()
{
if (this.m_image != null)
{
this.m_image.Dispose();
this.m_image = null;
}
//
GC.SuppressFinalize(this);
}
/// <summary>
/// 析构函数。
/// </summary>
~MemoryPicture()
{
if (this.m_image != null)
{
this.m_image.Dispose();
this.m_image = null;
}
}