Пример использования деструктора C # - PullRequest
4 голосов
/ 19 ноября 2010

Я читаю о деструкторах в C #, но у меня проблемы с поиском подходящего варианта использования.

Может ли кто-нибудь привести пример использования с объяснением?

Много, высоко ценится.

Обновление
В примере кода в книге реализован метод Desctuctor и метод Dispose (), см. Этот фрагмент кода из книги.

class MyClass
{
    bool disposed = false; // Disposal status
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    ~MyClass()
    {
        Dispose(false);
    }
    protected virtual void Dispose(bool disposing)
    {
        if (disposed == false)
        {
            if (disposing == true)
            {
                // Dispose the managed resources. Factored Dispose

            }
            // Dispose the unmanaged resources.

        }
        disposed = true;
    }
}

Marko

Ответы [ 6 ]

8 голосов
/ 19 ноября 2010

Финализаторы очень сейчас нужны редко. Они использовали , что требовалось, когда у вас был прямой доступ к собственным ресурсам - но теперь вы обычно должны использовать SafeHandle вместо.

У Джо Даффи есть отличный пост об этом , который содержит гораздо больше подробностей, чем я мог бы написать сам - так что читайте его:)

Краткое примечание по терминологии: версия спецификации C # для ECMA называет их финализаторами; версия спецификации Microsoft всегда называла их деструкторами и продолжает это делать.

2 голосов
/ 19 ноября 2010

Они финализаторы, а не деструкторы. Они часто используются для очистки неуправляемых ресурсов - если вы написали свой собственный класс файлов, то вам нужно будет использовать финализатор для очистки собственного дескриптора файла.

1 голос
/ 19 ноября 2010

Что вы подразумеваете под destructor?C # имеет

  • Шаблон IDisposable , который вы использовали бы для детерминированного уничтоженияПолезно закрывать ручки, когда они вам больше не нужны.Таким образом, они закрываются сейчас , и не всякий раз, когда GC решает собрать объект, который может быть намного позже или вообще отсутствует.Или в чистом управляемом коде сказать объекту удалить себя из графа объекта, отписаться от событий, ...Обычно используется с using оператором
  • Финализатор, который почти бесполезен.Он работает в неизвестное время, он может не работать вообще, ...Единственное, для чего я его использую - это напомнить мне, что я забыл позвонить в DisposeХотя он имеет синтаксис деструктора C ++, я не считаю его эквивалентом деструктора C ++.Я предпочитаю думать о Dispose() как о деструкторе.
  • Критическое завершение и SafeHandle s , которые вы используете для собственных ресурсов

Я думаю, что вместо шаблона, который вы разместили, современный код должен иметь собственный SafeHandle и вызывать его Dispose метод в своем собственном Dispose.

1 голос
/ 19 ноября 2010

Финализаторы редко нужны в C #, и добавление одного может привести к тому, что сборщику мусора потребуется больше времени для очистки мусора, так как для запуска финализатора требуется дополнительный проход.Вместо этого вы должны обычно использовать шаблон IDisposable.

Пример использования финализатора - если вы подозреваете утечку ресурсов, вы можете использовать его при отладке, чтобы проверить, правильно ли был вызван Dispose, перед тем как объект будет собран сборщиком мусора.Если объект, содержащий неуправляемые ресурсы, имеет свой финализатор, вызванный до вызова метода Dispose, это может быть признаком утечки ресурса.Но так как финализатор может никогда не вызываться, он не должен содержать никакой критической логики приложения.

0 голосов
/ 19 ноября 2010

C # не имеет «деструкторов», как вы, вероятно, думаете о них.С помощью сборщика мусора в .NET сбор объектов не будет происходить сразу же, когда ваш класс выйдет из области видимости.

Я думаю, что вас больше интересует шаблон IDisposable.Это детерминированный способ очистки ресурсов, которые использует ваш объект.

Кроме того, классы .NET могут иметь «финализаторы», которые выполняются при сборе объекта.Его можно использовать для вызова dispose, если исходный вызывающий объект вашего объекта игнорируется.

Но реализация финализатора в вашем классе ставит его в очередь для специальной обработки для GC и может оказать влияние на производительность.

0 голосов
/ 19 ноября 2010

Интерфейс IDisposable предоставляет метод для использования в качестве деструктора / финализатора.

Я имею в виду, что вы можете реализовать интерфейс IDisposable для освобождения ресурсовваш объект использует.Как уже говорили другие, это не то же самое, что старый добрый деструктор, поскольку метод Dispose() будет вызываться не самим вами, а управляемым кодом для удаления вашего объекта через некоторое время.

...