CA2216:可释放类型应声明终结器

类型名

DisposableTypesShouldDeclareFinalizer

CheckId

CA2216

类别

Microsoft.Usage

是否重大更改

原因

实现 System.IDisposable 并包含建议使用非托管资源的字段的类型未实现 Object.Finalize 所描述的终结器。

规则说明

如果可释放类型包含以下类型的字段,则将报告与该规则的冲突:

如何解决冲突

要修复与该规则的冲突,请实现一个终结器来调用您的 Dispose 方法。

何时禁止显示警告

如果类型没有实现 IDisposable 来释放非托管资源,则可以安全地禁止显示此规则发出的警告。

示例

下面的示例演示一个与该规则冲突的类型。

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:拥有本机资源的类型应是可释放的

请参见

参考

实现 Finalize 和 Dispose 以清理非托管资源

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize