In C #, was ist der Unterschied zwischen einem destructor und einer Finalize-Methode in einer Klasse?

StackOverflow https://stackoverflow.com/questions/1076965

  •  21-08-2019
  •  | 
  •  

Frage

Was ist der Unterschied, wenn es eine gibt, zwischen einem destructor und einer Finalize-Methode in einer Klasse ist?

Vor kurzem habe ich entdeckt, dass Visual Studio 2008 eine destructor gleichbedeutend mit einer Finalize-Methode betrachtet, was bedeutet, dass Visual Studio werden Sie gleichzeitig nicht zulassen, beide Methoden in einer Klasse definiert werden.

Zum Beispiel das folgende Codefragment:

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

    public bool Finalize()
    {
        return true;
    }
}

Gibt die folgenden Fehler auf dem Anruf im Destruktor finalisieren:

  

Der Aufruf ist nicht eindeutig zwischen den folgenden Methoden oder Eigenschaften:           'TestFinalize. ~ TestFinalize ()' und 'TestFinalize.Finalize ()

Und wenn der Anruf kommentiert finalisieren aus, es gibt die folgenden Fehler:

  

Typ ‚ManagementConcepts.Service.TestFinalize‘ definiert bereits ein Mitglied namens       ‚Finalisieren‘ mit den gleichen Parametertypen

War es hilfreich?

Lösung

Ein destructor in C # überschreibt System.Object.Finalize Methode. Sie müssen Verwendung destructor Syntax, dies zu tun. Manuelles Überschreiben Finalize erhalten Sie eine Fehlermeldung geben.

Im Grunde, was Sie versuchen, mit Ihrer Finalize Methodendeklaration zu tun ist,

Andere Tipps

Wikipedia hat einige gute Diskussion über den Unterschied zwischen einem Finalizerthread und einem destructor in den Finalizerthread Artikeln.

C # wirklich nicht über eine "echte" destructor. Die Syntax ähnelt einem C ++ destructor, aber es ist wirklich ein Finalizerthread. Sie schrieb es richtig im ersten Teil Ihres Beispiel:

~ClassName() { }

Die oben ist syntaktischer Zucker für eine Finalize Funktion. Sie stellt sicher, dass die Finalizers in der Basis ausgeführt werden garantiert, ist aber ansonsten identisch mit Überschreiben der Finalize Funktion. Dies bedeutet, dass, wenn Sie die destructor Syntax schreiben, du bist wirklich die Finalizerthread zu schreiben.

Laut Microsoft , bezieht sich der Finalizer auf die Funktion, die das Garbage Collector ruft, wenn es sammelt (Finalize), während der destructor ist Ihr Stück Code, der als Ergebnis führt (der syntaktische Zucker, die Finalize wird). Sie sind so nahe die gleiche Sache ist, dass Microsoft sollte nie den Unterschied gemacht hat.

Microsofts Verwendung des C ++ 's ‚destructor‘ Begriff ist irreführend, weil in C ++ auf dem gleichen Thread ausgeführt wird, sobald das Objekt gelöscht wird oder von dem Stapel genommene, während in C # ist es bei einem anderen auf einem separaten Thread ausgeführt Zeit.

hier gefunden: http: //sanjaysainitech.blogspot. com / 2007/06 / Differenz-between-destructor-dispose.html

  
      
  1. Destructor

         

    Sie sind spezielle Methoden, die für das Objekt bereinigen Code enthält.   Sie können sie nicht explizit in Ihrem Code aufrufen, wie sie genannt werden   implizit durch GC. In C # haben sie denselben Namen wie der Name Klasse voran   durch das ~ Zeichen. Wie -

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

    In VB.NET werden Destruktoren durch Überschreiben der Finalize umgesetzt   Verfahren der System.Object-Klasse.

  2.   
  3. Entsorgen

         

    Diese wie alle anderen Methoden in der Klasse und können aufgerufen werden   explizit, aber sie haben einen besonderen Zweck, die Aufgabe der Reinigung.   In der dispose-Methode schreiben wir Code für das Objekt aufzuräumen. Es ist   wichtig, dass wir frei geworden alle nicht verwalteten Recourcen in den dispose   Verfahren wie die Datenbankverbindung, Dateien usw. Die Klasse Umsetzung   entsorgen Methode sollte IDisposable Dispose-Methode implementieren Grenzfläche   sollte die GC.SuppressFinalize Methode für das Objekt aufrufen es ist   Anordnen, wenn die Klasse desturctor hat, weil es bereits getan hat die   arbeiten, um das Objekt zu bereinigen, dann ist es nicht für den Müll notwendig   Sammler rufen Sie das Finalize-Methode des Objekts. Referenz:    http://msdn2.microsoft.com/en-us /library/aa720161(VS.71).aspx

  4.   
  5. Finalisierung

         

    Eine Finalize-Methode wirkt als Schutz Ressourcen in dem aufzuräumen   Falls Ihre Dispose-Methode wird nicht aufgerufen. Sie sollten nur   eine Finalize-Methode implementieren nicht verwalteten Ressourcen zu bereinigen. Sie   sollten keine Finalize-Methode für verwaltete Objekte implementieren, weil   die Garbage Collector reinigt verwalteten Ressourcen automatisch.   Finalisieren Methode wird von der GC genannt implizit daher kann man nicht   nennt es aus dem Code.

         

    Hinweis: In C # finalisieren Methode nicht überschreiben kann, so müssen Sie   verwenden destructor interne Implementierung dessen wird außer Kraft setzen die   Finalisieren Verfahren in MSIL.But im VB.NET, Verfahren zum Abschluss bringen kann   außer Kraft setzen, weil es Destruktormethode unterstützt.

  6.   

Update:. Interessant halbbezogene Thread hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top