CA1049: Yerel kaynaklara sahip olan türler atılabilir olmalıdır
TürAdı |
TypesThatOwnNativeResourcesShouldBeDisposable |
CheckId |
CA1049 |
Kategori |
Microsoft.Design |
Bozan Değişiklik |
Bozmayan |
Sebep
Bir tür, IntPtr, UIntPtr veya HandleRef alanına başvurur ancak IDisposable 'i uygulamaz.
Kural Tanımı
Bu kural, IntPtr, UIntPtr, ve HandleRef alanlarının işaretcileri yönetilmeyen kaybaklara depoladığını varsayar.Yönetilmeyen kaynakları ayıran türler, arayanların isteğine bağlı kaynakları serbest bırakmak ve kaynakları tutan nesnelerin yaşam sürelerini kısaltmak için etkinleştirmek üzere IDisposable uygulamalıdır.
Yönetilmeyen kaynakları temizlemek için önerilen tasarım deseni, sırasıyla Object.Finalize ve IDisposable.Dispose yöntemlerini kullanarak, hem açık hem de kapalı yollarar sağlamaktır.Çöp toplayıcısı, nesne artık erişilemez olarak belirtildiğinde, belirlenmeyen bir zamanda nesnenin Finalize yöntemini çağırır.Finalize çağrıldıktan sonra, nesneleri boşaltmak için ek bir çöp toplama gereklidir.Dispose yöntemi açık ve isteğe bağlı olarak, çöp toplayacıya bırakılması durumdan daha erken , kaynakları, serbest bırakmasına izin verir.Yönetilmeyen kaynakları temizlledikten sonra Dispose, Finalize 'in çağrılmasına artık gerek olmadığını çöp toplayıcısına bildirmek için GC.SuppressFinalize yöntemini çağırmalıdır. Bu ek çöp toplamaya olan ihtiyacı yok eder ve nesnenin ömrünü kısaltır
İhlallerin Düzeltilmesi
Bu kuralın ihlalini düzeltmek için IDisposable 'i uygulayın.
Uyarılar Ne Zaman Bastırılmalı
Tür yönetilmeyen kaynağa başvuru yapmıyorsa, bu kuraldan bir uyarı baskılamak güvenlidir.Aksi takdirde, bu kuraldan bir uyarıyı baskılamayın çünkü IDisposable uygulamadaki hata yönetilmeyen kaynakların kullanılmaz ve uygun olmayan hale gelmesine neden olabilir.
Örnek
Aşağıdaki örnek, yönetilmeyen kaynakları temizlemek için IDisposable uygulayan bir türü gösterir.
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);
}
}
}
İlgili Kurallar
CA2115: Yerel kaynaklar kullanırken GC.KeepAlive'ı çağırın
CA1816: GC.SuppressFinalize öğesini doğru çağırın
CA2216: Atılabilir türler sonlandırıcıyı bildirmelidir
CA1001: Atılabilir alanlara sahip olan türler atılabilir olmalıdır
Ayrıca bkz.
Diğer Kaynaklar
Yönetilmeyen Kaynakları Temizleme
Implementing Finalize and Dispose to Clean Up Unmanaged Resources