2

Die Code-Review-Checkliste in meinem neuen Client-Platz hat folgende -Sollte ich GC.SupressFinalize auf IDisposable UND Finalisieren implementieren?

Klasse Dispose und Finalize Umsetzung

Warum einen Aufruf an GC.SupressFinalize in Entsorgen Implementierung haben sollte?

Sollte es nicht lesen, da die Klasse, die IDisposable-Schnittstelle implementiert, einen Aufruf von GC.SupressFinalize in der Dispose-Implementierung haben sollte?

Oder fehlt mir etwas albern?

Antwort

6

Sie vermissen die Tatsache, dass nicht jede Wegwerfklasse einen Finalizer benötigt - tatsächlich tun nur sehr wenige, particularly due to .NET 2.0's SafeHandle type. Wenn es keinen Finalizer gibt, warum sollten Sie SuppressFinalize anrufen?

1

Es ist genau. Wenn die Dispose (bool) -Methode ihren Zweck erfüllt hat, gibt es keinen Grund mehr, dass der Finalizer dies erneut tun kann. Das Aufrufen von GC.SuppressFinalize() ist eine Optimierung. Sie verhindern, dass .NET einen Finalizer aufruft, der nichts tut.

Ich bemerkte, dass Sie Klasse mit einem Kapital C geschrieben haben. Das ist ein Hinweis, dass Sie Ihren Code in VB.NET schreiben. Passen Sie auf, die IDE macht die falsche Sache in 99,99% aller Fälle. Sobald Sie die Eingabetaste drücken, nachdem "Implementiert IDisposable" eingeben, fügt es die falsch Code:

Private disposedValue As Boolean = False  ' To detect redundant calls 

    ' IDisposable 
    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
       ' TODO: free other state (managed objects). 
      End If 

      ' TODO: free your own state (unmanaged objects). 
      ' TODO: set large fields to null. 
     End If 
     Me.disposedValue = True 
    End Sub 

#Region " IDisposable Support " 
    ' This code added by Visual Basic to correctly implement the disposable pattern. 
    Public Sub Dispose() Implements IDisposable.Dispose 
     ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 
#End Region 

Yuck. Das ist die Boilerplate-Implementierung eines Finalizers, die in der MSDN Library btw gut dokumentiert ist. Es ist falsch. Es ist extrem selten einen Finalizer zu benötigen, die .NET-Klassen kümmern sich schon selbst darum. Wenn Sie wirklich ein Betriebssystem-Handle verwenden, sollten Sie eine der SafeHandle-abgeleiteten Klassen verwenden. Oder schreibe deinen eigenen Wrapper.

bearbeiten sie diese zurück:

Public Sub Dispose() Implements IDisposable.Dispose 
    someField.Dispose() 
    '' maybe some more 
    ''... 
End Sub 
Verwandte Themen