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);
}
}

浙公網安備 33010602011771號