CA1816: GC.SuppressFinalize öğesini doğru çağırın
TürAdı |
CallGCSuppressFinalizeCorrectly |
CheckId |
CA1816 |
Kategori |
Microsoft.Kullanım |
Bozan Değişiklik |
Bozmayan |
Sebep
Bu IDisposable.Dispose 'nın bir uygulaması olan bir yöntem GC.SuppressFinalize 'i çağırmaz.
Bu IDisposable.Dispose 'nın bir uygulaması olmayan bir yöntem GC.SuppressFinalize 'i çağırır.
Bir yöntem GC.SuppressFinalize 'i çağırır ve bu (Visual Basic'de Ben) dışında bir şey geçirir.
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