Aracılığıyla paylaş


CA1816: GC.SuppressFinalize öğesini doğru çağırın

TürAdı

CallGCSuppressFinalizeCorrectly

CheckId

CA1816

Kategori

Microsoft.Kullanım

Bozan Değişiklik

Bozmayan

Sebep

Kural Tanımı

Bu IDisposable.Dispose yöntemi kullanıcıya nesneyi çöp toplama işlemi için kullanılabilir duruma gelmesinden önce herhangi bir zamanda kaynakları serbest bırakması izinini verir.Eğer IDisposable.Dispose yöntemi aranıyor ise, nesnenin kaynaklarını serbest bırakır.Bu sonlandırmayı gereksiz hale getirir.IDisposable.Dispose, GC.SuppressFinalize 'ı çağırmalıdır, böylece çöp toplayıcı nesnenin sonlandırıcısını çağırmaz.

 

Türemiş türlerin sonlandırıcı ile yeniden uygulamak zorunda kalmasını önlemek için [System.IDisposable] ve onu çağırmak için ağzı açık türler sonlandırıcı olmadan hala GC.SuppressFinalize 'ı çağırmalıdır.

İhlallerin Düzeltilmesi

Bu kuralın bir ihlalini düzeltmek için:

Yöntem Dispose 'ın bir uygulaması ise, GC.SuppressFinalize 'e bir çağrı ekleyin.

Yöntem Dispose 'in bir uygulaması değil ise, ya GC.SuppressFinalize 'a olan çağrıyı kaldırın ya da türün Dispose uygulamasına onu taşıyın.

Bunu (Visual Basic'de Ben) geçirmek için GC.SuppressFinalize 'a yapılan tüm çağrıları değiştirin.

Uyarılar Ne Zaman Bastırılmalı

Eğer GC.SuppressFinalize kullanarak diğer nesnelerin yaşam süresini denetlemek için müzakere ediyorsanız, bu kuraldan gelen bir uyarıyı sadece baskılayın.Eğer Dispose 'nın bir uygulaması GC.SuppressFinalize 'ı aramıyorsa, bu kuraldan gelen bir uyarıyı baskılamayın.Bu durumda, sonlandırmayı bastırmadaki başarısızlık performansı düşürür ve hiçbir yararlar sağlamaz.

Örnek

Aşağıdaki örnek GC.SuppressFinalize 'ı yanlışlıkla arayan bir yöntemi gösterir.

Imports System
Imports System.Data.SqlClient

Namespace Samples

    Public Class DatabaseConnector
        Implements IDisposable

        Private _Connection As New SqlConnection

        Public Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(True)   ' Violates rules
        End Sub 

        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If disposing Then 
                If _Connection IsNot Nothing Then
                    _Connection.Dispose()
                    _Connection = Nothing 
                End If 
            End If 
        End Sub 

    End Class 

End Namespace
using System;
using System.Data.SqlClient;
namespace Samples
{
    public class DatabaseConnector : IDisposable
    {
        private SqlConnection _Connection = new SqlConnection();

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(true);  // Violates rule
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_Connection != null)
                {
                    _Connection.Dispose();
                    _Connection = null;
                }
            }
        }
    }
}

Aşağıdaki örnek GC.SuppressFinalize 'ı doğru bir şekilde arayan bir yöntemi gösterir.

Imports System
Imports System.Data.SqlClient

Namespace Samples

    Public Class DatabaseConnector
        Implements IDisposable

        Private _Connection As New SqlConnection

        Public Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub 

        Protected Overridable Sub Dispose(ByVal disposing As Boolean)
            If disposing Then 
                If _Connection IsNot Nothing Then
                    _Connection.Dispose()
                    _Connection = Nothing 
                End If 
            End If 
        End Sub 

    End Class 

End Namespace
using System;
using System.Data.SqlClient;

namespace Samples
{
    public class DatabaseConnector : IDisposable
    {
        private SqlConnection _Connection = new SqlConnection();

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
            if (disposing)
            {
                if (_Connection != null)
                {
                    _Connection.Dispose();
                    _Connection = null;
                }
            }
        }
    }
}

İlgili Kurallar

CA2215: Atma yöntemleri taban sınıf atmayı çağırmalıdır

CA2216: Atılabilir türler sonlandırıcıyı bildirmelidir

Ayrıca bkz.

Diğer Kaynaklar

Implementing Finalize and Dispose