35 votes

Le mot-clé "using" signifie-t-il que l'objet est éliminé et GC'ed?

J'ai frappé une conversation avec mon collègue aujourd'hui, qui a dit qu'elle avait juste appris la raison derrière l'utilisation de l' using déclaration.

 //Using keyword is used to clean up resources that require disposal (IDisposable interface). 

 using (StreamReader reader = new StreamReader(@"C:\test.txt")) 
 { 
 string line = reader.ReadLine(); 
 } 

Je l'ai fait remarquer que l'objet est marqué comme "Peuvent être éliminés", mais pas réellement éliminés et les déchets recueillis, à moins que GC décide de le faire.

Elle a répondu que l'objet sera détruit automatiquement une fois que l'utilisation de la déclaration se termine, car l'utilisation de déclaration est traduite en try-catch-finally bloc. Donc, l'objet doit obtenir éliminés à la fin de l'instruction à l'aide.

J'étais confus par cela, parce que je sais que l'utilisation d'un using déclaration ne garantit pas que l'objet se GC-recueillies. Tout ce qui se passe, c'est que l' Dispose() de la méthode appelée. Le GC décide quand GC il en soit. Mais quand elle a demandé pour preuve, je ne pouvais pas trouver tout.

Personne ne sait comment cela fonctionne, et comment le prouver?

41voto

Luaan Points 8934

Vous parlez de deux choses très différentes.

L'objet sera détruit dès que l' using-bloc se termine. Qui ne dit rien sur le moment où il est de ces ordures. Le seul moment de segment de mémoire est libérée, c'est quand un garbage collection se produit - ce qui ne se produit que sous la pression de la mémoire (sauf si vous utilisez GC.Collect explicitement).

Supprimer un objet signifie tout simplement en appelant ses Dispose méthode. Que le plus souvent signifie libérer une ressource rare, ou d'une ressource native (dans la pratique, toutes les ressources rares sont des sockets, fichiers, ...). Maintenant, il est bon que la durée de vie de l'objet jetable dans votre cas est d'une portée limitée, de sorte qu'il pourrait théoriquement être collectées dès que l' using-bloc se termine - cependant, ce n'est pas vraiment le cas dans la pratique, depuis le .NET runtime essaie d'éviter les collections - ils sont chers. Donc, jusqu'à ce que vous traversez une mémoire de l'allocation de seuil, pas de collection qui va arriver, même si vous avez un objet mort sur le tas.

Quel est donc le point de Dispose? Rien à voir avec la gestion de la mémoire. Vous n'avez pas vraiment à la mémoire gérée, et vous ne devriez pas s'attendre à ce que Dispose sera effectivement appelé, il n'a pas à être. La seule chose qui a à être appelé par le moteur d'exécution est le finaliseur, et vous ne pouvez jamais utiliser pour se débarrasser de ressources autochtones - en fait, il n'y a pas de garantie si les objets que vous avez une référence à encore exister au moment où le finaliseur pistes - la gestion de la mémoire peut ont déjà été récupérés par puis. C'est pourquoi vous ne jamais manipuler les ressources gérées dans un finaliseur.

Alors oui, elle était complètement à droite. Le point est que, IDisposable n'a rien à voir avec le garbage collector. Disposé à ne pas dire de ces ordures.

12voto

Sriram Sakthivel Points 33463

Elle est à droite sur l'argent, using déclaration est juste un syntatic sucre pour try/finally{obj.Dispose();} . using déclaration garantit que l'objet sera éliminé.(Jetez méthode sera appelée), mais il n'a pas de relation avec la collecte des ordures.

Jetez un oeil à cette Compréhension-la à l'aide de l'instruction

Réponse courte: Alors maintenant, nous savons à l'aide de déclaration est juste appelant Dispose et ne fait rien d'autre que cela, et garder à l'esprit qu' Dispose méthode spéciale que toutes les autres méthodes. C'est juste une méthode et c'est tout. Il n'est donc pas liée à la collecte des ordures. Il est intéressant de noter "Garbage Collector" ne sait même pas sur Dispose méthode ou IDisposable.

Espérons que cette aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X