共用方式為


CA2216:可處置型別應該宣告完成項

型別名稱

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

分類

Microsoft.Usage

中斷變更

不中斷

原因

實作 System.IDisposable 且具有建議 Unmanaged 資源用法之欄位的型別,未實作如 Object.Finalize 所述的完成項。

規則描述

如果可處置型別包含下列型別的欄位,就會報告違反此規則:

如何修正違規

若要修正此規則的違規情形,請實作會呼叫 Dispose 方法的完成項。

隱藏警告的時機

如果該型別並未實作 IDisposable 以達到釋放 Unmanaged 資源的目的,則您可以放心地隱藏這項規則的警告。

範例

下列範例顯示違反此規則的型別。

using System;  
using System.Runtime.InteropServices;

namespace UsageLibrary
{
    public class  DisposeMissingFinalize :IDisposable
    {
        private bool disposed = false;
        private IntPtr unmanagedResource;

        [DllImport("native.dll")]
        private static extern IntPtr AllocateUnmanagedResource();

        [DllImport("native.dll")]
        private static extern void FreeUnmanagedResource(IntPtr p);

        DisposeMissingFinalize()
        {
            unmanagedResource = AllocateUnmanagedResource();
        }

        protected virtual void Dispose(bool disposing) 
        {
            if (!disposed) 
            {
                // Dispose of resources held by this instance.
                FreeUnmanagedResource(unmanagedResource);
                disposed = true;

                // Suppress finalization of this disposed instance.
                if (disposing)
                {
                    GC.SuppressFinalize(this);
                }
            }
        }

        public void Dispose()
        {
            Dispose(true);
        }

        // Disposable types with unmanaged resources implement a finalizer.
        // Uncomment the following code to satisfy rule:
        //  DisposableTypesShouldDeclareFinalizer
        // ~TypeA()
        // {
        //     Dispose(false);
        // }
    }
}

相關規則

CA2115:使用原生資源時必須呼叫 GC.KeepAlive

CA1816:正確呼叫 GC.SuppressFinalize

CA1049:擁有原生資源的型別應為可處置

請參閱

參考

Implementing Finalize and Dispose

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize