using System; using System.ComponentModel; //下面的例子演示瞭如何建立 //實現IDisposable介面的資源類 //和IDisposable。處理方法。 public class DisposeExample { //實現IDisposable的基類。 //透過實現IDisposable,你宣佈 //這種型別的例項分配稀缺資源。 public class MyResource: IDisposable { // 指向外部非託管資源的指標。 private IntPtr handle; // 該類使用的其他託管資源。 private Component component = new Component(); // 跟蹤是否呼叫了Dispose。 private bool disposed = false; //類的建構函式。 public MyResource(IntPtr handle) { this.handle = handle; } //實現IDisposable。 //不要將此方法設為虛方法。 //派生類不能重寫此方法。 public void Dispose() { Dispose(disposing: true); //該物件將被Dispose方法清除。 //因此,應該呼叫GC。SuppressFinalize來將此物件從終結佇列中移除 //並阻止此物件的終結程式碼從執行第二次。 GC.SuppressFinalize(this); } //在兩個不同的場景中執行Dispose(bool Dispose)。 //如果dispose = true,則直接呼叫了該方法 //或間接地由使用者的程式碼。受管資源和非受管資源 //可以處理。 //如果dispose = false,則該方法已被 //終止器內部的執行時,你不應該引用 //其他物件。只能處置非託管資源。 protected virtual void Dispose(bool disposing) { //檢查是否已經呼叫了Dispose。 if(!this.disposed) { //如果處置等於true,處置所有已管理的非託管資源。 if(disposing) { // 處置託管資源。 component.Dispose(); } //呼叫適當的方法進行清理 //這裡的非託管資源。 //如果處置為false, //只執行以下程式碼。 CloseHandle(handle); handle = IntPtr.Zero; //處理完成。 disposed = true; } } //使用interop呼叫必要的方法清理非託管資源。 [System.Runtime.InteropServices.DllImport("Kernel32")] private extern static Boolean CloseHandle(IntPtr handle); //使用c#終結器語法來終結程式碼。 //只有當Dispose方法被呼叫時,這個終結器才會執行 //不被呼叫。 //它給基類一個完成的機會。 //不要在該類派生的型別中提供終結器。 ~MyResource() { //不要在這裡重新建立Dispose清理程式碼。 //呼叫Dispose(Dispose: false)是最優的 //可讀性和可維護性。 Dispose(disposing: false); } } public static void Main() { //在這裡插入程式碼建立 //並使用MyResource物件。 } }