ca1816: يتصل GC.SuppressFinalize بشكل صحيح
TypeName |
CallGCSuppressFinalizeCorrectly |
CheckId |
ca1816 |
Category |
Microsoft Office 2010 Suite. الاستخدام |
تعطيل تغيير |
غير فاصلة |
السبب
أسلوب الذي هو تطبيق IDisposable.Disposeلن باستدعاء GC.SuppressFinalize.
أسلوب الذي هو عدم تطبيق ل IDisposable.Disposeمكالمات GC.SuppressFinalize.
باستدعاء أسلوب GC.SuppressFinalizeوتمرير شيء غير ذلك من هذا (لي في Visual أساسى).
وصف القاعدة
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 أنواع يجب أن تقوم بتعريف أداة الإنهاء