Aracılığıyla paylaş


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

Ayrıca bkz.

Başvuru

IDisposable

IntPtr

HandleRef

UIntPtr

Object.Finalize

Diğer Kaynaklar

Implementing Finalize and Dispose