CA2215: Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다.
속성 | 값 |
---|---|
규칙 ID | CA2215 |
제목 | Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다. |
범주 | 사용 현황 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
System.IDisposable을 구현하는 형식은 IDisposable도 구현하는 형식에서 상속됩니다. 상속하는 형식의 Dispose 메서드는 부모 형식의 Dispose 메서드를 호출하지 않습니다.
규칙 설명
형식이 삭제 가능한 형식에서 상속되면 자체 Dispose 메서드에서 기본 형식의 Dispose 메서드를 호출해야 합니다. 기본 형식 Dispose
메서드를 호출하면 기본 형식에서 만든 모든 리소스가 해제됩니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 메서드에서 .Dispose를 호출base
합니다Dispose.
경고를 표시하지 않는 경우
. 호출이 규칙 검사보다 더 깊은 호출 수준에서 발생하는 경우 base
Dispose 이 규칙에서 경고를 표시하지 않는 것이 안전합니다.
경고 표시 안 함
단일 위반만 표시하지 않으려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 사용하지 않도록 설정한 후 다시 사용하도록 설정합니다.
#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);
}
}
}
}
참고 항목
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET