c# финализатор - В C # какова разница между деструктором и методом Finalize в классе?





финализаторы java (4)


В Википедии есть хорошее обсуждение разницы между финализатором и destructor в статье finalizer .

C # действительно не имеет «истинного» деструктора. Синтаксис напоминает деструктор C ++, но он действительно является финализатором. Вы правильно написали это в первой части вашего примера:

~ClassName() { }

Вышеупомянутый синтаксический сахар для функции Finalize . Это гарантирует, что финализаторы в базе гарантированно будут работать, но в остальном идентичны переопределению функции Finalize . Это означает, что когда вы пишете синтаксис деструктора, вы действительно пишете финализатор.

Согласно Microsoft , финализатор ссылается на функцию, которую собирает сборщик мусора, когда он собирает ( Finalize ), в то время как деструктор - это ваш бит кода, который выполняется в результате (синтаксический сахар, который становится Finalize ). Они настолько близки к тому, что Microsoft никогда не проводила различия.

Использование Microsoft термина «деструктор» в C ++ вводит в заблуждение, поскольку в C ++ он выполняется в том же потоке, как только объект удаляется или удаляется из стека, а в C # он выполняется в отдельном потоке в другое время.

В чем разница, если таковая существует, между деструктором и методом Finalize в классе?

Недавно я обнаружил, что Visual Studio 2008 считает деструктор синонимом метода Finalize, что означает, что Visual Studio не позволит вам одновременно определять оба метода в классе.

Например, следующий фрагмент кода:

class TestFinalize
{
    ~TestFinalize()
    {
        Finalize();
    }

    public bool Finalize()
    {
        return true;
    }
}

Дает следующую ошибку при вызове Finalize в деструкторе:

Вызов неоднозначен между следующими методами или свойствами: 'TestFinalize. ~ TestFinalize ()' и 'TestFinalize.Finalize ()'

И если вызов Finalize закомментирован, он дает следующую ошибку:

Тип «ManagementConcepts.Service.TestFinalize» уже определяет член, называемый «Finalize», с теми же типами параметров




Деструктор в C # переопределяет метод System.Object.Finalize . Для этого вам нужно использовать синтаксис деструктора. В ручном переопределении Finalize сообщение об ошибке.

В основном то, что вы пытаетесь сделать с объявлением метода Finalize , hiding метод базового класса. Это заставит компилятор выпустить предупреждение, которое можно отключить с помощью new модификатора (если он будет работать). Здесь важно отметить, что вы не можете одновременно override и объявлять new член с одинаковым именем, поэтому наличие деструктора и метода Finalize приведет к ошибке (но вы можете , хотя и не рекомендуется, объявить public new void Finalize() метод public new void Finalize() если вы не объявляете деструктор).




Найдено здесь: http://sanjaysainitech.blogspot.com/2007/06/difference-between-destructor-dispose.html

  1. Destructor

    Это специальные методы, которые содержат код очистки для объекта. Вы не можете вызывать их явно в своем коде, поскольку они неявно называются GC. В C # у них есть то же имя, что и имя класса, которому предшествует знак ~ . Подобно-

    Class MyClass
    {
    
    ~MyClass()
    {
    .....
    }
    }
    

    В VB.NET деструкторы реализуются путем переопределения метода Finalize класса System.Object.

  2. избавиться

    Они аналогичны любым другим методам в классе и могут быть вызваны явно, но у них есть особая цель для очистки объекта. В методе dispose мы записываем код очистки для объекта. Важно, чтобы мы освободили все неуправляемые источники в методе удаления, такие как подключение к базе данных, файлы и т. Д. Класс, реализующий метод dispose, должен реализовывать интерфейс IDisposable. Метод Dispose должен вызывать метод GC.SuppressFinalize для объекта, который он утилизирует, если класс имеет desturctor, потому что он уже выполнил работу по очистке объекта, тогда сборщик мусора не нужно вызывать метод Finalize объекта. Ссылка: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx

  3. завершать

    Метод Finalize служит защитой для очистки ресурсов в случае, если ваш метод Dispose не вызван. Вы должны использовать только метод Finalize для очистки неуправляемых ресурсов. Вы не должны реализовывать метод Finalize для управляемых объектов, потому что сборщик мусора автоматически очищает управляемые ресурсы. Метод Finalize вызывается GC неявно, поэтому вы не можете его вызывать из своего кода.

    Примечание. В C # метод Finalize нельзя переопределить, поэтому вам нужно использовать деструктор, внутренняя реализация которого переопределит метод Finalize в MSIL. Но в VB.NET метод Finalize может быть переопределен, поскольку он поддерживает метод деструктора.

Обновление: интересная полусвязанная тема .




Абстрактная функция не может иметь тело и ДОЛЖНА быть переопределена дочерними классами

Виртуальная функция будет иметь тело и может или не может быть переопределена дочерними классами





c# destructor finalize