다음을 통해 공유


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

속성
규칙 ID CA2216
제목 삭제 가능한 형식은 종료자를 선언해야 합니다.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

System.IDisposable을 구현하며 관리되지 않는 리소스를 사용하도록 제안하는 필드가 있는 형식은 System.Object.Finalize에 설명된 대로 종료자를 구현하지 않습니다.

규칙 설명

삭제 가능한 형식에 다음 형식의 필드가 포함되어 있으면 이 규칙의 위반이 보고됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 Dispose 메서드를 호출하는 종료자를 구현합니다.

경고를 표시하지 않는 경우

형식이 관리되지 않는 리소스를 해제하기 위해 IDisposable을 구현하지 않는 경우에는 이 규칙에서 경고를 표시하지 않아도 됩니다.

경고 표시 안 함

단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.

#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216

파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않도록 설정하려면 구성 파일에서 심각도를 none으로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

예시

다음 예제에서는 해당 규칙을 위반하는 형식을 보여 줍니다.

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);
    // }
}

CA1816: GC.SuppressFinalize를 올바르게 호출하십시오.

참고 항목