다음을 통해 공유


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

속성
규칙 ID CA2216
제목 삭제 가능한 형식은 종료자를 선언해야 합니다.
범주 사용 현황
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

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를 올바르게 호출하십시오.

참고하기