Ekinlikler
17 Mar 21 - 21 Mar 10
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Hemen kaydolunBu tarayıcı artık desteklenmiyor.
En son özelliklerden, güvenlik güncelleştirmelerinden ve teknik destekten faydalanmak için Microsoft Edge’e yükseltin.
Özellik | Değer |
---|---|
Kural Kimliği | CA1816 |
Başlık | GC.SuppressFinalize'ı doğru çağırın |
Kategori | Kullanım |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 9'da varsayılan olarak etkin | Öneri olarak |
Bu kuralın ihlalleri aşağıdakilerden kaynaklanabilir:
Korumasız bir sınıfta uygulaması olan ve çağırmayan IDisposable.Disposebir GC.SuppressFinalize yöntemdir.
uygulaması olmayan ve çağıran IDisposable.Disposebir GC.SuppressFinalize yöntem.
Bu (C#) veya GC.SuppressFinalize) dışında bir şeyi çağıran ve geçiren bir yöntem.
IDisposable.Dispose yöntemi, kullanıcıların nesne çöp toplama için kullanılabilir duruma gelmeden önce istedikleri zaman kaynakları serbest bırakmasına olanak tanır. IDisposable.Dispose yöntemi çağrılırsa, nesnesinin kaynaklarını serbesttir. Bu, sonlandırmayı gereksiz kılar. IDisposable.Dispose atık toplayıcının nesnenin sonlandırıcısını çağırmaması için çağırmalıdır GC.SuppressFinalize .
Sonlandırıcıları olan türetilmiş türlerin yeniden IDisposable tahmin etmek ve çağırmak zorunda olmasını önlemek için, sonlandırıcıları olmayan korumasız türler yine çağırmalıdır GC.SuppressFinalize.
Bu kuralın ihlalini düzeltmek için:
yöntemi uygulamasıysa Disposeöğesine bir çağrı GC.SuppressFinalizeekleyin.
yöntemi uygulaması Disposedeğilse, çağrısı GC.SuppressFinalize kaldırın veya türün Dispose uygulamasına taşıyın.
Bunu (C#) veya GC.SuppressFinalize) geçirmek için tüm çağrıları olarak değiştirin.
Türün geçersiz kılınması amaçlanmamışsa olarak işaretleyin sealed
.
Bu kuraldan gelen bir uyarıyı, diğer nesnelerin kullanım ömrünü denetlemek için bilerek kullanıyorsanız GC.SuppressFinalize gizleyebilirsiniz. uygulaması çağrısı Disposeyapmıyorsa, bu kuraldan gelen bir uyarıyı GC.SuppressFinalize gizlemeyin. Bu durumda, sonlandırmanın gizlenmemesi performansı düşürür ve hiçbir avantaj sağlamaz.
Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.
#pragma warning disable CA1816
// The code that's violating the rule is on this line.
#pragma warning restore CA1816
Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini none
olarak ayarlayın.
[*.{cs,vb}]
dotnet_diagnostic.CA1816.severity = none
Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.
Bu kod, öğesini çağıran GC.SuppressFinalizeancak bu (C#) veya Ben (Visual Basic) geçirmeyen bir yöntemi gösterir. Sonuç olarak, bu kod CA1816 kuralını ihlal eder.
Public Class DatabaseConnector
Implements IDisposable
Private _Connection As New SqlConnection
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
' Violates rules
GC.SuppressFinalize(True)
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
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;
}
}
}
}
Bu örnekte, bu (C#) veya Ben (Visual Basic)GC.SuppressFinalizedoğru şekilde çağıran bir yöntem gösterilmektedir.
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
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;
}
}
}
}
.NET geri bildirimi
.NET, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin:
Ekinlikler
17 Mar 21 - 21 Mar 10
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.
Hemen kaydolun