Вопрос

Контрольный список проверки кода в моем новом клиентском месте имеет следующее -

Урок реализации класса Утилизация и доработка должна иметь вызов 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top