CA1049: 네이티브 리소스가 있는 형식은 삭제 가능해야 합니다.
TypeName |
TypesThatOwnNativeResourcesShouldBeDisposable |
CheckId |
CA1049 |
범주 |
Microsoft.Design |
변경 수준 |
주요 변경 아님 |
원인
형식이 System.IntPtr 필드, System.UIntPtr 필드 또는 System.Runtime.InteropServices.HandleRef 필드를 참조하지만 System.IDisposable을 구현하지 않습니다.
규칙 설명
이 규칙에서는 IntPtr, UIntPtr 및 HandleRef 필드에 관리되지 않는 리소스에 대한 포인터가 저장된다고 가정합니다. 관리되지 않는 리소스를 할당하는 형식은 IDisposable을 구현하여 호출자가 필요할 때 해당 리소스를 해제할 수 있도록 하고 리소스를 차지하고 있는 개체의 수명을 줄여야 합니다.
관리되지 않는 리소스를 정리하는 데 권장되는 디자인 패턴은 각각 Object.Finalize 메서드와 IDisposable.Dispose 메서드를 사용하여 해당 리소스를 해제하기 위한 암시적 방법과 명시적 방법을 모두 제공하는 것입니다. 가비지 수집기에서는 개체에 더 이상 접근할 수 없음을 확인한 후 아무 때나 개체의 Finalize 메서드를 호출합니다. Finalize가 호출된 후에는 추가적인 가비지 수집을 수행하여 개체를 해제해야 합니다. Dispose 메서드를 통해 호출자는 리소스가 가비지 수집기에 남겨져 해제되기 전에 필요에 따라 리소스를 명시적으로 해제할 수 있습니다. 관리되지 않는 리소스를 정리한 후 Dispose는 GC.SuppressFinalize 메서드를 호출하여 가비지 수집기에서 Finalize를 더 이상 호출할 필요가 없음을 인식하도록 해야 합니다. 이렇게 하면 추가적인 가비지 수집이 필요 없고 개체의 수명이 단축됩니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 IDisposable을 구현합니다.
경고를 표시하지 않는 경우
형식이 관리되지 않는 리소스를 참조하지 않을 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다. 그렇지 않을 경우, IDisposable 구현에 실패하면 관리되지 않는 리소스를 사용할 수 없게 될 수 있으므로 이 규칙에서 경고를 표시하십시오.
예제
다음 예제에서는 IDisposable을 구현하여 관리되지 않는 리소스를 정리하는 형식을 보여 줍니다.
Imports System
Namespace DesignLibrary
Public Class UnmanagedResources
Implements IDisposable
Dim unmanagedResource As IntPtr
Dim disposed As Boolean = False
Sub New
' Allocate the unmanaged resource ...
End Sub
Overloads Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Protected Overloads Overridable Sub Dispose(disposing As Boolean)
If Not(disposed) Then
If(disposing) Then
' Release managed resources.
End If
' Free the unmanaged resource ...
unmanagedResource = IntPtr.Zero
disposed = True
End If
End Sub
Protected Overrides Sub Finalize()
Dispose(False)
End Sub
End Class
End Namespace
using System;
namespace DesignLibrary
{
public class UnmanagedResources : IDisposable
{
IntPtr unmanagedResource;
bool disposed = false;
public UnmanagedResources()
{
// Allocate the unmanaged resource ...
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// Release managed resources.
}
// Free the unmanaged resource ...
unmanagedResource = IntPtr.Zero;
disposed = true;
}
}
~UnmanagedResources()
{
Dispose(false);
}
}
}
관련 규칙
CA2115: 네이티브 리소스를 사용하는 경우에는 GC.KeepAlive를 호출하십시오.
CA1816: GC.SuppressFinalize를 올바르게 호출하십시오.
CA2216: 삭제 가능한 형식은 종료자를 선언해야 합니다.
CA1001: 삭제 가능한 필드가 있는 형식은 삭제 가능해야 합니다.
참고 항목
참조
Finalize 및 Dispose를 구현하여 관리되지 않는 리소스 정리