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

83

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

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

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

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

    public bool Finalize()
    {
        return true;
    }
}

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

The call is ambiguous between the following methods or properties: 'TestFinalize.~TestFinalize()' and 'TestFinalize.Finalize()'

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

Type 'ManagementConcepts.Service.TestFinalize' already defines a member called 'Finalize' with the same parameter types

Ваш Ответ

3   ответа
18

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

Destructor

They are special methods that contains clean up code for the object. You can not call them explicitly in your code as they are called implicitly by GC. In C# they have same name as the class name preceded by the ~ sign. Like-

Class MyClass
{

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

In VB.NET, destructors are implemented by overriding the Finalize method of the System.Object class.

Dispose

These are just like any other methods in the class and can be called explicitly but they have a special purpose of cleaning up the object. In the dispose method we write clean up code for the object. It is important that we freed up all the unmanaged recources in the dispose method like database connection, files etc. The class implementing dispose method should implement IDisposable interface.A Dispose method should call the GC.SuppressFinalize method for the object it is disposing if the class has desturctor because it has already done the work to clean up the object, then it is not necessary for the garbage collector to call the object's Finalize method. Reference: http://msdn2.microsoft.com/en-us/library/aa720161(VS.71).aspx

Finalize

A Finalize method acts as a safeguard to clean up resources in the event that your Dispose method is not called. You should only implement a Finalize method to clean up unmanaged resources. You should not implement a Finalize method for managed objects, because the garbage collector cleans up managed resources automatically. Finalize method is called by the GC implicitly therefore you can not call it from your code.

Note: In C#, Finalize method can not be override, so you have to use destructor whose internal implementation will override the Finalize method in MSIL.But in the VB.NET, Finalize method can be override because it does support destructor method.

Update: Интересная полу-связанная нить здесь.

Error: User Rate Limit Exceeded
You should only implement a Finalize method to clean up unmanaged resourcesError: User Rate Limit Exceeded
Error: User Rate Limit ExceededDisposeError: User Rate Limit ExceededDisposeError: User Rate Limit ExceededFinalizeError: User Rate Limit Exceeded
62

деструктор вфинализатор статья.

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

~ClassName() { }

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
57

System.Object.Finalize метод. Выhave to используйте для этого синтаксис деструктора. Переопределение вручнуюFinalize выдаст вам сообщение об ошибке.

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

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