36 votes

C # Le 'nouveau' mot clé sur les objets existants

Je me demandais à ce qui se passe à un objet (en C#), une fois que sa référence devient réaffectés. Exemple:

Car c = new Car("Red Car");
c = new Car("Blue Car");

Depuis que la référence a été réutilisé, le garbage collector jeter / poignée de la "Voiture Rouge" après il a perdu de sa référence? Ou n'est séparé de la méthode à mettre en œuvre pour disposer de la "voiture rouge'?

Je suis principalement demandais parce que il y a une relativement grande de l'objet que je vais recycler, et ont besoin de savoir si il y a quelque chose qui doit être fait quand il soit recréé.

36voto

Richard Everett Points 18318

Dans votre exemple, l' Red Car instance de c deviendront admissibles pour la collecte des ordures lorsqu' c est attribué à l' Blue Car. Vous n'avez pas besoin de faire quoi que ce soit.

Découvrez cette (vieille mais pertinente) article MSDN sur le .NET garbage collector. http://msdn.microsoft.com/en-us/magazine/bb985010.aspx

Le premier paragraphe dit tout:

La collecte des ordures dans le Microsoft .NET common language runtime environnement complètement absout le développeur de suivi de l'utilisation de la mémoire et de savoir quand pour libérer de la mémoire.

34voto

user7116 Points 39829

Depuis que la référence a été réutilisé, le garbage collector jeter / poignée de la "Voiture Rouge" après c'est perdu, il est la référence?

Vous êtes à la recherche à ce peut-être dans le mauvais sens:

c [*] ----> [Car { Name = "Red Car" }]  // Car c = new Car("Red Car")

Ensuite, votre étape suivante:

c [*]       [Car { Name = "Red Car"  }] // No chain of references to this object
   \------> [Car { Name = "Blue Car" }] // c = new Car("Blue Car")

Le GC va venir le long et "recueillir" l'un de ces objets qui ont pas de chaîne de références à un objet à un certain moment dans l'avenir. Pour la plupart des tâches, aussi longtemps que vous utilisez gérées de données, vous ne devriez pas vous soucier de grands objets et petits objets.

Pour la plupart des tâches que vous avez seulement à vous soucier déterministe de gestion de la mémoire lorsque vous traitez avec des IDisposable. Tant que vous suivez les meilleures pratiques de l' using-blocs, vous serez généralement bien.

7voto

BrokenGlass Points 91618

Vous créez un nouvel objet et lui affectez une référence à votre variable c . Dans le même temps, l'objet précédent (la "voiture rouge") n'est plus référencé et peut être récupéré.

6voto

Can Poyrazoğlu Points 4951

S'il n'y a pas d'autres références à la voiture rouge, elle sera collectée par le GC lors de son prochain cycle. Vous n'avez besoin de rien de plus (sauf si c'est une classe qui a des flux, etc. qui doivent être supprimés)

5voto

Joel Coehoorn Points 190579

Le garbage collector poignée de nettoyage pour la voiture rouge quand il n'est pas plus enraciné (pas accessible). Vous, le développeur, ne disposent généralement pas de s'inquiéter à propos du nettoyage de la mémoire dans .Net.

Il y a trois mises en garde qui doivent être mentionnés:

  1. Il ne se fera pas tout de suite. La collecte des ordures va se passer quand il arrive. Vous ne pouvez pas prédire.
  2. Si le type implémente IDisposable, c'est à vous de assurez-vous que l' .Méthode dispose() est appelée. Un using déclaration est un bon moyen pour accomplir cette tâche.
  3. Vous avez mentionné qu'il est un objet de grande taille. Si c'est plus de 85000 octets, il sera stocké dans un endroit appelé le Tas d'Objets Volumineux, ce qui a des règles différentes pour la collecte des ordures. Permettant ce genre d'objet à être recyclés peuvent souvent causer des problèmes.

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