C# IDispose使用例項

风云-何辉發表於2024-11-30
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物件。
    }
}

相關文章