CA2216: Atılabilir türler sonlandırıcıyı bildirmelidir
Özellik | Değer |
---|---|
Kural Kimliği | CA2216 |
Başlık | Atılabilir türler sonlandırıcıyı bildirmelidir |
Kategori | Kullanım |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
uygulayan System.IDisposableve yönetilmeyen kaynakların kullanılmasını öneren alanları olan bir tür, tarafından System.Object.Finalizeaçıklandığı gibi sonlandırıcı uygulamaz.
Kural açıklaması
Atılabilir tür aşağıdaki türlerdeki alanları içeriyorsa bu kuralın ihlali bildirilir:
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için yönteminizi Dispose çağıran bir sonlandırıcı uygulayın.
Uyarıların ne zaman bastırılması gerekiyor?
Tür yönetilmeyen kaynakları serbest bırakmak amacıyla uygulanmıyorsa IDisposable , bu kuraldan gelen bir uyarıyı bastırmak güvenlidir.
Uyarıyı gizleme
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA2216
// The code that's violating the rule is on this line.
#pragma warning restore CA2216
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA2216.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Örnek
Aşağıdaki örnekte bu kuralı ihlal eden bir tür gösterilmektedir.
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
CA1816: GC.SuppressFinalize öğesini doğru çağırın