VB.NET - Должен Завершить метод быть добавленным при реализации IDisposable?

Если вы хотите увидеть, нажали ли они точный ключ (например, «b») Сделайте следующее:

while True:
    choice = raw_input("> ")

    if choice == 'b' :
        print "You win"
        input("yay")
        break
5
задан Laurent 22 September 2008 в 10:59
поделиться

4 ответа

При фактическом содержании неуправляемых ресурсов, которые не будут автоматически очищены сборщиком "мусора" и очищающий неуправляемые ресурсы в Вашем Располагать (), то да, необходимо выполнить, то же Завершает ().

Если Вы реализуете IDisposable по некоторой другой причине, реализация Завершают (), не требуется.

Основной вопрос - это: Если Располагают (), не был назван, и Ваш объект собрал "мусор", был бы утечка памяти? Если да, реализация Завершает. Если не, Вы не должны. Кроме того, постарайтесь не реализовывать, Завершают "просто, потому что это более безопасно". Объектам с пользовательскими финализаторами могут потенциально быть нужны две передачи GC для освобождения их - однажды для помещения их на незаконченную очередь финализаторов, и вторая передача в на самом деле освобождает их память.

11
ответ дан 18 December 2019 в 09:55
поделиться

Нет, Вы не должны иметь, Завершают, если у Вас нет неуправляемых ресурсов для чистки.

В большинстве случаев причина, класс доступен, состоит в том, потому что это сохраняет ссылки на другие управляемые объекты IDisposable. В этом случае не Завершите метод, необходимо или желателен.

3
ответ дан 18 December 2019 в 09:55
поделиться

Как другие сказали, Вы не должны реализовывать финализатор, если Вы непосредственно не держите неуправляемые ресурсы. Кроме того, принятие Вас работает в.NET 2.0 или позже, маловероятно, что необходимо будет когда-либо реализовывать финализатор, потому что обычно SafeHandle может использоваться для обертывания неуправляемых ресурсов.

Я записал довольно длинное сообщение в блоге, покрывающее фон и реализацию IDisposable и финализаторов некоторое время назад, которые могут стоить чтения, если Вы не полностью соглашаетесь с этим.

1
ответ дан 18 December 2019 в 09:55
поделиться
Implements IDisposable

Public Overloads Sub Dispose() Implements IDisposable.Dispose

    Dispose(True)
    GC.SuppressFinalize(Me)

End Sub

Protected Overloads Sub Dispose(ByVal disposing As Boolean)

    If disposing Then
        ' Free other state (managed objects).
    End If
    ' Free your own state (unmanaged objects).
    ' Set large fields to null.
End Sub

Protected Overrides Sub Finalize()

    Dispose(False)
    MyBase.Finalize()

End Sub
2
ответ дан 18 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: