CA2215: Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다.
속성 | 값 |
---|---|
규칙 ID | CA2215 |
타이틀 | Dispose 메서드는 기본 클래스 Dispose를 호출해야 합니다. |
범주 | 사용 현황 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 8에서 기본적으로 사용 | 아니요 |
원인
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);
}
}
}
}
참고 항목
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기