В C# в чем разница между деструктором и методом Finalize в классе?
в чем разница, если она есть, между деструктором и методом Finalize в классе?
недавно я обнаружил, что Visual Studio 2008 считает деструктор синонимом метода Finalize, что означает, что Visual Studio не позволит вам одновременно определять оба метода в классе.
например, следующий фрагмент кода:
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
выдает следующую ошибку при вызове Finalize в деструкторе:
вызов неоднозначен между следующих методов или свойств: 'TestFinalize.~TestFinalize () 'и' TestFinalize.Finalize ()'
и если вызов Finalize закомментирован, это дает следующую ошибку:
Тип ' ManagementConcepts.Услуга.TestFinalize ' уже определяет вызываемый элемент 'Аськи' с теми же типами параметров
3 ответа:
деструктор в C# переопределение
System.Object.Finalize
метод. Ты обязательно для этого используйте синтаксис деструктора. Переопределение вручнуюFinalize
даст вам сообщение об ошибке.в основном то, что вы пытаетесь сделать с вашим
Finalize
объявление метода прячась метод базового класса. Это заставит компилятор выдать предупреждение, которое может быть отключено с помощьюnew
модификатор (если получится). Важно отметить вот что ты не могу иoverride
и объявитьnew
член с одинаковым именем в то же время, так что имея как деструктор иFinalize
метод приведет к ошибке (а вы можете, хотя и не рекомендуется, объявитьpublic new void Finalize()
метод, если вы не объявлять деструктор).
в Википедии есть хорошая дискуссия о разнице между финализатором и деструктор на финализатор статьи.
C# действительно не имеет "истинного" деструктора. Синтаксис напоминает деструктор C++, но это действительно финализатор. Вы написали это правильно в первой части вашего примера:
~ClassName() { }
выше синтаксический сахар для
деструктор
это специальные методы, которые содержат код очистки для объекта. Вы не можете вызвать их явно в коде, как они называются неявно GC. В C# они имеют то же имя, что и имя предшествующего класса кстати
~
знак. Как -Class MyClass { ~MyClass() { ..... } }
In VB.NET, деструкторы реализуются путем переопределения Finalize метод работы системы.Класс объекта.
распоряжения
Они так же, как и любые другие методы в классе и могут быть вызваны явно, но у них есть специальная цель очистки объекта. В методе dispose мы пишем код очистки для объекта. Это важно, что мы освободили все неуправляемые ресурсы в dispose способ как подключения к базе данных, файлы и т. д. Реализация класса метод dispose должен реализовывать интерфейс IDisposable.Метод Dispose надо позвонить в ГК.Метод SuppressFinalize для объекта утилизация, если класс имеет desturctor, потому что он уже сделал работайте, чтобы очистить объект, тогда он не нужен для мусора коллектор для вызова метода Finalize объекта. Ссылка: http://msdn2.microsoft.com/en-us/library/aa720161(против.71).аспн
завершить
A Метод Finalize действует как гарантия для очистки ресурсов в системе случае, если метод Dispose не вызывается. Вы должны только реализация метода Finalize для очистки неуправляемых ресурсов. Вы не следует реализовывать метод Finalize для управляемых объектов, т. к. сборщик мусора автоматически очищает управляемые ресурсы. Метод Finalize вызывается GC неявно, поэтому вы не можете вызвать его из кода.
Примечание: в C#, метод Finalize нельзя переопределить, поэтому вам придется используйте деструктор, внутренняя реализация которого переопределит Завершить метод в MSIL.Но в то же время VB.NET, метод Finalize может быть переопределить, потому что он поддерживает метод деструктора.
обновление:интересная полу-связанная нить здесь.