다음을 통해 공유


CA2216: 삭제 가능한 형식은 종료자를 선언해야 합니다.

TypeName

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: 네이티브 리소스가 있는 형식은 삭제 가능해야 합니다.

참고 항목

참조

Implementing Finalize and Dispose

System.IDisposable

System.IntPtr

System.Runtime.InteropServices.HandleRef

System.UIntPtr

Object.Finalize