CA2213: 삭제 가능한 필드는 삭제해야 합니다.
TypeName |
DisposableFieldsShouldBeDisposed |
CheckId |
CA2213 |
범주 |
Microsoft.Usage |
변경 수준 |
주요 변경 아님 |
원인
System.IDisposable을 구현하는 형식이 마찬가지로 IDisposable을 구현하는 형식으로 된 필드를 선언합니다. 필드의 Dispose 메서드가 선언 형식의 Dispose 메서드에서 호출되지 않습니다.
규칙 설명
형식에서는 해당 형식의 관리되지 않는 모든 리소스를 삭제해야 하며 IDisposable을 구현하여 이 작업을 수행합니다. 이 규칙에서는 삭제 가능한 형식 T가 삭제 가능한 형식 FT의 인스턴스인 F 필드를 선언하는지 여부를 확인합니다. 이 규칙에서는 각 F 필드에 대해 FT.Dispose 호출을 찾습니다. 그런 다음 T.Dispose에서 호출하는 메서드와 한 수준 낮은 메서드, 즉 FT.Dispose에서 호출하는 메서드에서 호출하는 메서드를 검색합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 필드에서 보유하는 관리되지 않는 리소스를 할당하고 해제할 책임이 있는 경우 IDisposable을 구현하는 형식의 필드에 대해 Dispose를 호출합니다.
경고를 표시하지 않는 경우
필드에서 보유하고 있는 리소스를 해제할 책임이 없거나 Dispose 호출이 규칙에서 확인하는 호출 수준보다 깊은 호출 수준에서 발생하는 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.
예제
다음 예제에서는 IDisposable을 구현하는 TypeA 형식을 보여 줍니다(이전 설명의 FT).
using System;
namespace UsageLibrary
{
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);
}
}
}
다음 예제에서는aFieldOfADisposableType 필드(이전 설명의 F)를 삭제 가능한 형식(TypeA)으로 선언하고 필드에 대해 Dispose를 호출하지 않음으로써 이 규칙을 위반하는 TypeB 형식을 보여 줍니다. TypeB는 이전 토론에서 T에 해당합니다.
using System;
namespace UsageLibrary
{
public class TypeB : IDisposable
{
// Assume this type has some unmanaged resources.
TypeA aFieldOfADisposableType = new TypeA();
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
// Violates rule: DisposableFieldsShouldBeDisposed.
// Should call aFieldOfADisposableType.Dispose();
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
if (!disposed)
{
// Dispose of resources held by this instance.
Dispose(true);
}
}
// Disposable types implement a finalizer.
~TypeB()
{
Dispose(false);
}
}
}