مشاركة عبر


ca1816: يتصل GC.SuppressFinalize بشكل صحيح

TypeName

CallGCSuppressFinalizeCorrectly

CheckId

ca1816

Category

Microsoft Office 2010 Suite. الاستخدام

تعطيل تغيير

غير فاصلة

السبب

وصف القاعدة

IDisposable.Disposeأسلوب يسمح للمستخدمين بتحرير موارد في أي وقت قبل كائن أن تصبح متوفرة من أجل تجميع البيانات المهملة. إذا IDisposable.Disposeأسلوب هو يسمى، يحرر موارد للكائن. يجعل هذا الإنهاء غير ضرورية. IDisposable.Disposeيجب أن يتصلGC.SuppressFinalizeحتى حاوي المهملات لم تكن يتصل أداة الإنهاء كائن.

 

لمنع الحاجة إلى re-implement الأنواع المشتقة ذات finalizers [System.IDisposable]و يتصل، أنواع unsealed بدون finalizers يجب لا يزال يتصل GC.SuppressFinalize.

كيف إلى الإصلاح انتهاكات

إلى إصلاح انتهاكا لهذه قاعدة:

إذا كان الأسلوب هو تطبيق Dispose، قم بإضافة استدعاء GC.SuppressFinalize.

إذا كان الأسلوب ليس تطبيق Dispose، أما إزالة يتصل إلى GC.SuppressFinalizeأو نقله إلى للنوع Disposeالتنفيذ.

قم بتغيير الجميع المكالمات إلى GC.SuppressFinalizeلتمرير هذه (Me) في Visual أساسى.

عند إلى منع التحذيرات

منع ظهور تحذير من هذه قاعدة فقط إذا تم deliberating باستخدام GC.SuppressFinalizeللتحكم في فترة تواجد الكائنات الأخرى. لا تقوم بمنع تحذير من هذه قاعدة في حالة تطبيق Disposeلن باستدعاء GC.SuppressFinalize. في هذه الحالة، تفشل إلى منع الإنهاء ينخفض الأداء وتوفر فوائد لا.

مثال

يلي مثال يظهر أسلوب يقوم بشكل غير صحيح باستدعاء GC.SuppressFinalize.

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;
                }
            }
        }
    }
}

يلي مثال يظهر أسلوب بشكل صحيح تستدعي GC.SuppressFinalize.

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;
                }
            }
        }
    }
}

القواعد ذات الصلة

ca1901: يجب أن تكون تصريحات P/Invoke المحمولة

ca2216: disposable أنواع يجب أن تقوم بتعريف أداة الإنهاء

راجع أيضًا:

المرجع

تطبيق إنهاء و التخلص إلى تنظيف لأعلى موارد غير المُدارة