CA2216: Atılabilir türler sonlandırıcıyı bildirmelidir
TürAdı |
DisposableTypesShouldDeclareFinalizer |
CheckId |
CA2216 |
Kategori |
Microsoft.Usage |
Bozan Değişiklik |
Bozmayan |
Sebep
Uygulayanın bir türü IDisposable ve yönetilmeyen kaynakların kullanımını öneren alanlara sahiptir. Object.Finalize tarafından açıklandığı gibi bir sonlarındırıcı uygulanmaz.
Kural Tanımı
Bu kuralı ihlali, eğer aşağıdaki türlerde atılabilen tür alanları varsa bildirilir.
İhlallerin Düzeltilmesi
Bu kuralın ihlalini düzeltmek için, sonlandırıcı Dispose yönteminizi çağırır.
Uyarılar Ne Zaman Bastırılmalı
Eğer tür IDisposable yönetilmeyen kaynakları serbest bırakmak amacıyla uygulanmazsa bu kuraldan bir uyarı bastırmak güvenlidir.
Örnek
Aşağıdaki örnekte, bu kuralı ihlal eden bir tür gösteriliyor.
using System;
using System.Runtime.InteropServices;
namespace UsageLibrary
{
public class DisposeMissingFinalize :IDisposable
{
private bool disposed = false;
private IntPtr unmanagedResource;
[DllImport("native.dll")]
private static extern IntPtr AllocateUnmanagedResource();
[DllImport("native.dll")]
private static extern void FreeUnmanagedResource(IntPtr p);
DisposeMissingFinalize()
{
unmanagedResource = AllocateUnmanagedResource();
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
// Dispose of resources held by this instance.
FreeUnmanagedResource(unmanagedResource);
disposed = true;
// Suppress finalization of this disposed instance.
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public void Dispose()
{
Dispose(true);
}
// Disposable types with unmanaged resources implement a finalizer.
// Uncomment the following code to satisfy rule:
// DisposableTypesShouldDeclareFinalizer
// ~TypeA()
// {
// Dispose(false);
// }
}
}
İlgili Kurallar
CA2115: Yerel kaynaklar kullanırken GC.KeepAlive'ı çağırın
CA1816: GC.SuppressFinalize öğesini doğru çağırın
CA1049: Yerel kaynaklara sahip olan türler atılabilir olmalıdır