Должен ли я реализовать gc.cupressfinalize на iDisposable и доработал?
-
25-09-2019 - |
Вопрос
Контрольный список проверки кода в моем новом клиентском месте имеет следующее -
Урок реализации класса Утилизация и доработка должна иметь вызов gc.supressfinalize в упреждении внедрения
Почему?
Должен ли он не читать как класс, реализующий iDisposable интерфейс должен иметь вызов gc.supressfinalize в реализации убытки?
Или я не хватаю что-то глупое?
Решение
Тебе не хватает того факта, что не каждый одноразовый класс нуждается в финаризате - на самом деле, очень немногие делают, особенно из-за .NET 2.0 SafeHandle
тип. Отказ Если нет финализатора, почему вам нужно позвонить SuppressFinalize
?
Другие советы
Это точно. Если метод Dispose (Bool) выполнил свою работу, то нет никакой точки, чтобы позволить финаризатору сделать это снова. Вызов gc.suppressfinalize () - это оптимизация, вы останавливаетесь .NET от беспокойства, чтобы вызвать финализатор, который ничего не делает.
Я заметил, что вы написали класс с капиталом C. Это намек, который вы пишете свой код в VB.NET. Остерегайтесь, IDE делает неправильно вещь в 99,99% всех случаев. Как только вы нажимаете ввод после набора текста «IDSPosable», он вставляет неправильно код:
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
Auck. Это реализация котельной финализатора, хорошо документирована в библиотеке MSDN BTW. Это не правильно. Очень редко на самом деле нужен финализатор, классы .NET уже заботится о себе. Если вы действительно используете обработку операционной системы, вы должны использовать один из полученных классов Safehandle. Или напишите свою собственную обертку.
Отредактируйте его обратно к этому:
Public Sub Dispose() Implements IDisposable.Dispose
someField.Dispose()
'' maybe some more
''...
End Sub