2010-04-15 5 views
0

Si ma classe n'a AUCUN destructeur, il est hors de portée. GC s'exécute à un certain moment, maintenant va-t-il simplement récupérer la mémoire de ma classe OU appellera-t-il son destructeur ou Finalize() dessus?Si ma classe n'a pas de destructeur, GC appellera-t-il Finalize() dessus?

Et la classe de structure. NET comme SQLConnection implémente-t-elle un destructeur? J'ai vu qu'il a une implémentation Dispose() mais n'a pas vu le destructeur en utilisant "Aller à la définition".

Répondre

2

Finalize est appelé sur l'objet que lorsque l'objet est placé sur la file d'attente de finalisation. Une façon de le mettre là est de lui donner un destructeur. En C# s'il n'y a pas de destructeur, l'objet ne sera pas placé dans la file d'attente de finalisation.

Comme d'autres ont souligné ne pas utiliser à moins que vous devez Destructeurs car il ralentit la collecte des ordures. Lorsque GC découvre qu'un tel objet peut être récupéré, au lieu de libérer de la mémoire, il place l'objet dans la file d'attente de finalisation.En d'autres termes, l'objet survit au GC initial et ne sera récupéré qu'après l'exécution des finaliseurs

0

Le implentation par défaut de Finalize() ne fait rien pour autant que je sache, si elle appelle ou non importe peu.

La grande majorité des classes n'ont pas besoin d'un finaliseur personnalisé, si vous utilisez des ressources gérées, le Garbage Collector pourra le nettoyer.

Si votre classe n'utilise pas de ressources non managées, vous devez éviter l'utilisation d'une implentation Finalize car elles prennent du temps.

+0

merci, je suis au courant de ces derniers et ai lu à travers de nombreux articles, pensé que quelqu'un va connaître la réponse exacte à Ceci, donc posté ici. –

2

Bonne lecture à travers cet article, il peut aider, mais de ce que je sais s'il y a un destructor/Finaliser il sera appelé autre GC siply gratuitement la mémoire.

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

+0

J'ai lu celui-ci, s'il n'y a pas de destructeur, GC n'appellera pas de destructeur. Mais appellera-t-il Finalize dessus? Y a-t-il un moyen de le vérifier? –

+0

@isthatacode si vous implémentez un destructeur, il sera appelé. Sinon, la mémoire est juste libérée. – AndrewC

+0

@isthatacode: Le destructeur est juste une syntaxe spéciale utilisée pour remplacer 'Finalize'. – LukeH

2

Si un objet n'a pas destructor alors il est pas ajouté à la file d'attente de finalisation, en premier lieu, de sorte que le GC simplement libérer de la mémoire etc quand il nettoie.

Le CPG appelle uniquement le code destructeur/finalisation pour les objets dans la file d'attente de finalisation.

+0

@Luke - merci cela a du sens. –

1

C'est pitoyable. Honte à toutes les personnes qui ont "répondu" à cette question en ne sachant rien, ni en répondant réellement à la question.

Voici votre réponse:

Cette méthode est appelée automatiquement après un objet devient inaccessible, à moins que l'objet a été exempté de la finalisation par un appel à SuppressFinalize. Lors de l'arrêt d'un domaine d'application, Finalize est automatiquement appelé sur les objets qui ne sont pas exemptés de finalisation, même ceux qui sont encore accessibles. Finalize n'est automatiquement appelé qu'une seule fois sur une instance donnée, sauf si l'objet est réenregistré à l'aide d'un mécanisme tel que ReRegisterForFinalize et que GC.SuppressFinalize n'a pas été appelé ultérieurement.

de:

http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

+2

@gmagana: Votre propre réponse est trompeuse: La méthode 'Finalize' n'est appelée que pour les objets qui ont été ajoutés à la file d'attente de finalisation (c'est-à-dire les objets qui surchargent la méthode' Finalize'). – LukeH

+0

Oui, honte aux gens d'essayer d'aider. – AndrewC

+0

@ gmagana- merci pour votre réponse. Je pense que nous ne devrions pas utiliser un langage insultant ici. –

0

Vous can't call a destructor in C#, en soi. Ils sont invoqués automatiquement.

Vous pouvez instancier un nouvel objet, et aussi longtemps que sont gérés (lire: ne pas mettre en œuvre IDisposible) toutes ses ressources, il sera nettoyé lorsque:

  • Le Garbage collector décide de lancer
  • Aucune référence reste ce point à cet objet

pour les classes qui mettent en œuvre IDisposible, votre meilleur pari est d'envelopper leur utilisation dans un communiqué using, qui veillera à ce que le Dispose() méthode est appelée lorsque cet objet est hors de portée.

Suggestions de lecture: