CA1001: 삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다.
TypeName |
TypesThatOwnDisposableFieldsShouldBeDisposable |
CheckId |
CA1001 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 아님 - 형식이 어셈블리 외부에 표시되지 않는 경우 주요 변경 - 형식이 어셈블리 외부에 표시되는 경우, |
원인
클래스가 System.IDisposable 형식인 인스턴스 필드를 선언하고 구현하지만 클래스가 IDisposable을 구현하지 않습니다.
규칙 설명
클래스는 해당 클래스 소유의 관리되지 않는 리소스를 삭제하기 위해 IDisposable 인터페이스를 구현합니다.형식이 IDisposable인 인스턴스 필드는 필드에 관리되지 않는 리소스가 있음을 나타냅니다.IDisposable 필드를 선언하는 클래스는 관리되지 않는 리소스를 간접적으로 소유하며 IDisposable 인터페이스를 구현해야 합니다.클래스에서 직접 소유하는 관리되지 않는 리소스가 없는 경우에는 종료자를 구현하지 않아야 합니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 IDisposable을 구현하고 IDisposable.Dispose 메서드에서 필드의 Dispose 메서드를 호출합니다.
경고를 표시하지 않는 경우
이 규칙에서는 경고를 표시해야 합니다.
예제
다음 예제에서는 규칙을 위반하는 클래스와 IDisposable을 구현하여 규칙을 충족하는 클래스를 보여 줍니다.이 클래스는 관리되지 않는 리소스를 직접 소유하지 않기 때문에 종료자를 구현하지 않습니다.
Imports System
Imports System.IO
Namespace DesignLibrary
' This class violates the rule.
Public Class NoDisposeMethod
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
End Class
' This class satisfies the rule.
Public Class HasDisposeMethod
Implements IDisposable
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
Overloads Protected Overridable Sub Dispose(disposing As Boolean)
If disposing Then
' dispose managed resources
newFile.Close()
End If
' free native resources
End Sub 'Dispose
Overloads Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub 'Dispose
End Class
End Namespace
using System;
using System.IO;
namespace DesignLibrary
{
// This class violates the rule.
public class NoDisposeMethod
{
FileStream newFile;
public NoDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
}
// This class satisfies the rule.
public class HasDisposeMethod: IDisposable
{
FileStream newFile;
public HasDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// dispose managed resources
newFile.Close();
}
// free native resources
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
관련 규칙
CA2216: 삭제 가능한 형식은 종료자를 선언해야 합니다.