En C # Quelle est la différence entre un destructor et une méthode Finaliser dans une classe?

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

  •  21-08-2019
  •  | 
  •  

Question

Quelle est la différence, si elle existe, entre un destructor et une méthode Finaliser dans une classe?

J'ai récemment découvert que Visual Studio 2008 considère un destructor synonyme d'une méthode Finalize, ce qui signifie que Visual Studio ne vous permet pas de définir simultanément les deux méthodes dans une classe.

Par exemple, le fragment de code suivant:

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

    public bool Finalize()
    {
        return true;
    }
}

Donne l'erreur suivante sur l'appel à Finaliser dans le destructor:

  

L'appel est ambigu entre les méthodes ou les propriétés suivantes:           'TestFinalize. ~ TestFinalize ()' et 'TestFinalize.Finalize ()

Et si l'appel à Finaliser est commenté, il donne l'erreur suivante:

  

Type « ManagementConcepts.Service.TestFinalize » définit déjà un membre appelé       « Finaliser » avec les mêmes types de paramètres

Était-ce utile?

La solution

A destructor dans la méthode C # des substitutions System.Object.Finalize. Vous doivent utilisez la syntaxe destructor pour le faire. Annulation manuelle vous donnera Finalize un message d'erreur.

En fait ce que vous essayez de faire avec votre déclaration de méthode est new cacher la méthode de la classe de base. Il provoque le compilateur d'émettre un avertissement qui peut être réduit au silence à l'aide du modificateur override (si elle allait travailler). La chose importante à noter ici est que vous ne peut pas à la fois et public new void Finalize() déclarez un membre <=> ayant le même nom en même temps pour avoir à la fois une destructor et une méthode entraînera <=> une erreur (mais vous peut , mais pas recommandé, déclarer une méthode si vous <=> ne pas déclarer une destructor).

Autres conseils

Wikipedia a une bonne discussion sur la différence entre un finaliseur et un destructor dans l'article finaliseur.

C # n'a vraiment pas destructor "true". La syntaxe ressemble à un C ++ destructor, mais il est vraiment un finaliseur. Vous avez écrit correctement dans la première partie de votre exemple:

~ClassName() { }

Ce qui précède est du sucre syntaxique pour une fonction Finalize. Il veille à ce que les finaliseurs dans la base sont garantis pour fonctionner, mais est par ailleurs identique à la substitution de la fonction <=>. Cela signifie que lorsque vous écrivez la syntaxe destructor, vous écrivez vraiment le finaliseur.

Selon Microsoft , le finaliseur fait référence à la fonction que la garbage collector appelle quand il recueille (<=>), tandis que le destructor est votre morceau de code qui exécute en conséquence (le sucre syntaxique qui devient <=>). Ils sont si près d'être la même chose que Microsoft aurait jamais fait la distinction.

L'utilisation de Microsoft terme « destructor » du C ++ est trompeur, car en C ++ est exécuté sur le même fil que dès que l'objet est supprimé ou sauté de la pile, alors que dans C # est exécuté sur un thread séparé à un autre temps.

trouvés ici: http: //sanjaysainitech.blogspot. com / 2007/06 / différence entre-destructor-dispose.html

  
      
  1. Destructeur

         

    Ce sont des méthodes spéciales qui contient le code pour nettoyer l'objet.   Vous ne pouvez pas les appeler explicitement dans votre code comme on les appelle   implicitement par GC. En C #, ils ont le même nom que le nom de la classe a précédé   par le signe ~. Comme -

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

    Dans VB.NET, sont mises en œuvre par Destructeurs redéfinissant la Finaliser   Procédé de la classe System.Object.

  2.   
  3. Éliminez

         

    Ce sont comme tous les autres méthodes de la classe et peuvent être appelés   explicitement mais ils ont un but spécial de nettoyage l'objet.   Dans la méthode Éliminez nous écrivons nettoyer le code pour l'objet. Il est   important que nous avons libéré toutes les recources non gérés dans le Éliminez   méthode comme la connexion de base de données, fichiers, etc. La classe implémentant   disposer méthode devrait mettre en œuvre IDisposable interface.Un méthode Dispose   devrait appeler la méthode GC.SuppressFinalize pour l'objet est   disposer si la classe a desturctor parce qu'il a déjà fait la   travail pour nettoyer l'objet, il n'est pas nécessaire pour les ordures   collecteur pour appeler la méthode Finalize de l'objet. Référence:    http://msdn2.microsoft.com/en-us /library/aa720161(VS.71).aspx

  4.   
  5. Finaliser

         

    Une méthode Finaliser agit comme une garantie pour nettoyer les ressources dans le   Si votre méthode Dispose est pas appelé. Vous ne devriez   mettre en œuvre une méthode Finaliser pour nettoyer les ressources non gérés. Toi   ne devrait pas mettre en œuvre une méthode Finaliser pour les objets gérés, parce que   le garbage collector nettoie automatiquement les ressources gérées.   Finaliser méthode est appelée par le GC, vous pouvez donc pas implicitement   appeler à partir de votre code.

         

    Remarque: En C #, Finaliser méthode ne peut pas être prioritaire, donc vous devez   utiliser destructor dont la mise en œuvre interne remplacera la   Finaliser méthode MSIL.But dans le VB.NET, Finaliser méthode peut être   remplacer car elle prend en charge la méthode destructor.

  6.   

Mise à jour:. Intéressant fil semi-lié

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top