Aracılığıyla paylaş


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