Par exemple, dans le code ci-dessous, une image'Object sera créée et puis des ordures recueillies à un point inconnu dans le futur Quoi de P> void MyFunction() {
DoSomething(RetrieveImage());
}
4 Réponses :
Non. En fait, vous ne voulez pas vraiment que ce soit des ordures recueillies - Inviter le collecteur des ordures très fréquemment réduira les performances.
Ce que vous les em> veux de disposer des ressources non gérées dans les meilleurs délais - Et c'est là que qui appellera Vous devez utiliser le Variable supplémentaire cependant - sauf si vous changez Idisposable code> est entré dans, ainsi que le à l'aide de code> instruction: p> image .Dispose () code> comme il laisse le à l'aide de la relève code>, que ce soit ou non DOSMATHIAT code> a jeté une exception. P> DOSMATHIGH code> pour prendre un Func public void ApplyToEachLineInFile(string file, Action<string> action)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
action(line);
}
}
}
Belle suggestion de passer dans le délégué du fournisseur. C'est un modèle très utile dans de nombreux cas.
Pourquoi est-ce que c'est mieux que Dosomething (récupérimageimage ()); et disposer le bitmap dans DOSOMODIAT?
Parce que si le bitmap est transmis à Dosomething, comment Dosomething peut-il savoir s'il est prudent de disposer? Et si l'appelant souhaitait passer le bitmap à DosomeLeLeLse après avoir transmis au dosage?
@JOEL - Mes suggestions et mon jon éliminent le bitmap dans Dosomething.
@MBeckish: ma deuxième suggestion fait, mais elle dit explicitement: "Notez que cela ne donne pas la possibilité de passer dans un bitmap sans qu'il soit éliminé - ce qui pourrait poser problème si vous souhaitez l'utiliser plus tard."
@Jon - Oui, et je conviens que cela pourrait être une source de confusion. Je me demandais simplement s'il y avait un avantage à la transmission d'un fournisseur d'images par rapport au dossage (récupérimageimage ()).
@MBeckish: Dans la situation où Dosomething a-t-il toujours été éliminé à la fin? Éventuellement pas beaucoup ...
@MBeckish: avoir une réponse mise à jour avec un meilleur exemple du motif :)
Un autre avantage de ce modèle est que ApplyToeachLineInfile pourrait être une méthode statique sur une classe avec une CTOR privée qui enveloppe la ressource, cela signifierait que vous pourriez forcer les appelants à utiliser la ressource en toute sécurité (ne fonctionne pas si elles ont besoin de ressources en tant que commutation. )
La collecte des ordures ne se produit pas lorsqu'un objet tombe hors de portée. Il s'agit plutôt d'une fonction de gestion de la mémoire automatique du cadre. P>
http://msdn.microsoft.com/en-us/magazine /bb985010.aspx P>
Vous pouvez forcer .NET à récupérer les ordures, mais à moins que vous ne viviez pas de problèmes de mémoire graves, je ne vous recommanderais pas de descendre de cette voie. P>
D'accord, il est généralement préférable de laisser le collecteur des ordures effectuer ses propres tâches automatiquement par opposition à l'invoquer manuellement.
Vous pouvez appliquer la collecte des ordures avec: p>
system.gc.collect () a> p>
Après la disposition correctement (voir Jons Réponse pour l'utilisation de () {} - Syntaxe). P>
N'oubliez pas (comme je viens de le faire) p>
.Gc.waitforpendendSurinalisateurs (); P>
après. p>
edit> p>
Bien qu'il ne soit pas recommandé - comme dit Jon. P>
Appeler Collect ne garantit i> qu'un objet hors de portée est réellement collecté. Il existe de nombreux scénarios intéressants et bizarres dans lesquels un tel objet peut vivre longtemps. Notez également que vous devriez généralement attendre que les finaliseurs en attente s'exécutent si vous forcez une collection; Les finaliseurs en attente fonctionnent sur un autre fil, il pourrait donc y avoir des courses.
try
{
Bitmap image = RetrieveImage();
DoSomething(image);
}
finally
{
GC.Collect();
}
Notez que, pour que cela fonctionne, il est crucial que la variable code> image code> soit déclarée à l'intérieur du Essayez code> Déclaration, comme indiqué. Sinon, le temps d'exécution peut ou ne peut pas envisager l'objet inaccessible, et vous risquez de la promouvoir à une génération plus élevée, empêchant efficacement l'objet de toujours être recueilli.
Je ne vois aucune différence entre 1 et 2. Pourquoi devrait-il se comporter de différentes ordures?
Je ne suis pas vraiment un défenseur de "Que voudriez-vous que ceci" des commentaires de type, mais sérieusement, le collectionneur de poubelles .NET connaît vraiment mieux que le programmeur lorsqu'il est un bon moment pour faire du nettoyage. Gardez à l'esprit que le .NET VM n'est pas un système en temps réel. En outre, si vous avez des ressources non gérées, utilisez Idisposable et utilisez.
Vous devez faire confiance au collectionneur de déchets standard - il est fort probable que vous perdiez des performances si vous deviez forcer la collecte des ordures. Y a-t-il une raison particulière avec laquelle vous vous préoccupez quand cela se produit?
DrJokePu, sauf que vous travaillez avec queer .Net-Com-com-objets qui souhaitent être collectés par la force après les libérer avec système.Runtime.Interopservices.marshal.ReleeSecomObject. SAP ...
Appelant DOSOMODING (TRIPIMIMAGE ()); Dans la mycée, créez une sorte de référence anonyme au bitmap dans le cadre de la pile de myfunction? Sinon, la deuxième option est meilleure, car le bitmap est éligible pour être GC'D lorsqu'il est sorti quelque chose, plutôt que d'attendre que la mycée soit sortie.