CLR via C# 读书笔记 5-1 何时对托管资源使用Finalize

Finalize方法常用于回收非托管资源,以防止资源泄露

在较少的情况下它也会被用于托管资源

1.构造函数中如果抛出异常, 那么只有Finalize方法才会被执行,在这里可以回收一些已经分配的资源

(Dispose不会被执行!!!)当然:Finalize方法的执行时间还是下一次GC的时候(依然不确定时间)

如果不实现该方法将会造成资源泄露

以下代码演示了在这种情况

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Reflection.Emit;

using Oracle.DataAccess.Client;
using System.Runtime.InteropServices;
using System.Collections.Concurrent;
namespace ClassLibrary1
{


public class SourceClass
{

[STAThread]
static void Main(string[] args)
{
try
{
using (ClassA a = new ClassA())
{
}
}
catch (Exception)
{

}
try
{
ClassB a
= new ClassB();
}
catch (Exception)//这可不是一个代码好习惯, 只是为了测试才做成这样
{

}
Console.WriteLine(
"Collect");
GC.Collect();
Console.WriteLine(
"End");
//在我的机器上输出结果依次是
//Collect
//End
//Finalize
Console.ReadLine();
}
internal class ClassA : IDisposable
{
public ClassA()
{
throw new Exception("Just A Test");
}

public void Dispose()
{
Console.WriteLine(
"Dispose");
}
}
internal class ClassB
{
public ClassB()
{
throw new Exception("Just B Test");
}

~ClassB()
{
Console.WriteLine(
"Finalize");
}
}
}
}

 

所以一般情况下为了完全避免资源泄露例如Memory leak, 通常将类实现为以下的方式

 

代码
internal class ClassA : IDisposable
{
public ClassA()
{
throw new Exception("Just A Test");
}

public void Dispose()
{
Dispose(
true);
GC.SuppressFinalize(
this);
}

public void Dispose(bool disposing)
{
//do something
Console.WriteLine("Dispose");
}

~ClassA()
{
this.Dispose(false);
}
}

 

posted on 2010-12-06 11:37  听说读写  阅读(447)  评论(0编辑  收藏  举报

导航