다음을 통해 공유


CA2215: Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다.

속성
규칙 ID CA2215
제목 Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다.
범주 사용 현황
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

System.IDisposable을 구현하는 형식은 IDisposable도 구현하는 형식에서 상속됩니다. 상속하는 형식의 Dispose 메서드는 부모 형식의 Dispose 메서드를 호출하지 않습니다.

규칙 설명

형식이 삭제 가능한 형식에서 상속되면 자체 Dispose 메서드에서 기본 형식의 Dispose 메서드를 호출해야 합니다. 기본 형식 Dispose 메서드를 호출하면 기본 형식에서 만든 모든 리소스가 해제됩니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 메서드에서 .Dispose를 호출base합니다Dispose.

경고를 표시하지 않는 경우

. 호출이 규칙 검사보다 더 깊은 호출 수준에서 발생하는 경우 baseDispose 이 규칙에서 경고를 표시하지 않는 것이 안전합니다.

경고 표시 안 함

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

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

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

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

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

예시

다음 예제에서는 IDisposable을 구현하는 TypeA와 형식 TypeA에서 상속되고 해당 Dispose 메서드를 올바르게 호출하는 TypeB라는 두 가지 형식을 보여 줍니다.

Namespace ca2215

    Public Class TypeA
        Implements IDisposable

        Protected Overridable Overloads Sub Dispose(disposing As Boolean)
            If disposing Then
                ' dispose managed resources
            End If
            
            ' free native resources
        End Sub

        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub

        ' Disposable types implement a finalizer.
        Protected Overrides Sub Finalize()
            Dispose(False)
            MyBase.Finalize()
        End Sub

    End Class

    Public Class TypeB
        Inherits TypeA

        Protected Overrides Sub Dispose(disposing As Boolean)
            If Not disposing Then
                MyBase.Dispose(False)
            End If
        End Sub

    End Class

End Namespace
using System;

namespace ca2215
{
    public class TypeA : IDisposable
    {
        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                // Dispose managed resources
            }

            // Free native resources
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        // Disposable types implement a finalizer.
        ~TypeA()
        {
            Dispose(false);
        }
    }

    public class TypeB : TypeA
    {
        protected override void Dispose(bool disposing)
        {
            if (!disposing)
            {
                base.Dispose(false);
            }
        }
    }
}

참고 항목