규칙클래스이름: | TypesThatOwnDisposableFieldsShouldBeDisposable |
규칙ID: | CA1001 |
분류: | 디자인 규칙 |
메시지 레벨: | 심각한 에러 |
확실도: | 95% |
원인:
System.IDisposable 인터페이스를 구현한 인스턴스 필드를 선언한 클래스에서
IDisposable 인터페이스를 구현하지 않은 경우에 해당한다.
규칙설명
클래스는 가지고 있는 관리되지 않는 리소스(파일 스트림 등의)를 제거하기 위해서
IDisposable 인터페이스를 구현하게 된다.
IDisposable 형식의 인스턴스 필드가 있다는 것이 바로 그 필드가 관리되지 않는 리소스를 가지고 있다는 것을 말해 주는 것이다. 간접적으로 관리되지 않는 리소스를 가지고 있는
IDisposable 필드를 선언한 클래스는 반드시
IDisposable 인터페이스를 구현해야 한다. 또 주의해야 할 것은 직접적으로 어떤 관리되지 않는 리소스를 가지고 있지 않는 클래스는 finalizer를 구현해서는 안된다.
예제코드
[C#]
using System;
using System.IO;
namespace DesignLibrary
{
//규칙을 위반한 예제이다.
public class NoDisposeMethod
{
FileStream newFile;
public NoDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
}
//이 클래스 구현은 규칙을 만족한다.
public class HasDisposeMethod: IDisposable
{
FileStream newFile;
public HasDisposeMethod()
{
newFile = new FileStream(@"c:\temp.txt", FileMode.Open);
}
public void Dispose()
{
newFile.Close();
}
}
}
[VB.NET]
Imports System
Imports System.IO
Namespace DesignLibrary
'규칙을 위반한 예제이다
Public Class NoDisposeMethod
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
End Class
'규칙을 만족하는 구현이다.
Public Class HasDisposeMethod
Implements IDisposable
Dim newFile As FileStream
Sub New()
newFile = New FileStream("c:\temp.txt", FileMode.Open)
End Sub
Sub Dispose() Implements IDisposable.Dispose
newFile.Close()
End Sub
End Class
End Namespace
관련 규칙
삭제가능한 필드는 삭제되어야 한다.
삭제가능한 형식은 finalizer를 선언해야 한다.
Dispose 메서드는 베이스 클래스의 Dispose 메서드를 호출해야 한다.
native 리소스를 가지고 있는 형식은 삭제가능해야 한다.
원문주소:
http://www.gotdotnet.com/team/fxcop/Docs/Rules/Design/TypesThatOwnDisposableFieldsShouldBeDisposable.html