Raymond Chen a laissé comparer Vous voulez savoir si la référence
le nombre est zéro ou non nul. Pour ça,
utiliser une faiblesseference. p>
blockQuote> Cet exemple de code démontre les problèmes qui s'appuient sur forçant une collection de déchets et la propriété
Notes h2>
code de code h2>
isalive code> faim pour déterminer si un objet a des références remarquables à cela. p>
3 Réponses :
Nope, non sans utiliser l'API de débogueur. P>
Comme vous le dites, les objets ne font pas référence à compter ... Donc, la seule façon de découvrir serait de ramper le tas, qui arrive normalement dans le cadre de la collecte des ordures. P>
Notez que même après qu'il n'y ait aucune "normale" de solides références, l'objet pourrait être ressuscité dans le cadre de la finalisation de toute façon - efficacement, la file d'attente finaliseur en fait une référence si elle a un finaliseur. Peut-être que vous ne voudriez pas inclure l'objet comme "Référence - moins" dans cette situation de toute façon. P>
"Non" était la réponse que j'ai supposée. Nous verrons si quelqu'un est en désaccord. Mais avec vous 205k de représentant, je pense que vous allez être l'autorité à ce sujet.
Vous pouvez essayer d'ajouter une conversion implicite en objet sous forme d'affaiblissement qui le prend comme paramètre et ajoutez un compteur dans cette méthode de conversion implicite, mais toutes les autres choses qui l'obtiennent comme objet l'incrémentent également. La conversion implicite en objet pourrait également être bloquée infiniment se répéter. Les médailles d'or par point sont également importantes.
@HUSEYINTUGRULBUYUKISIK: Vous ne pouvez pas ajouter de conversion implicite sur objet code>, et pour être honnête, je ne vois pas comment cela aiderait. Je ne comprends pas non plus la dernière partie de votre commentaire ...
@Jonskeet est-ce à cause de la collecte des ordures? Dernière partie, je veux dire que des médailles d'or plus fréquentes ont l'air cool et que vous avez maintenu une fréquence pendant 530 médailles.
@HUSEYINTUGRULBUYUKISIK: Est-ce quoi de la collecte des ordures? L'interdiction des conversions implicites à l'objet? Non pas du tout.
Vous devriez lire Raymond Chen's POST A > À propos des comptes de référence d'hier. Après cela - vous devriez décider si c'est quelque chose que vous devez vraiment faire et pourquoi. Ensuite, revenez et dites-nous pourquoi. P>
hmm, il semble que vous ayez lu les détails mineurs post-absorbé et avez manqué le point. P>
Je veux savoir s'il est prudent d'appeler à disposer sur une connexion de base de données. p>
blockQuote>
Lire les documents. Disposer Appels Fermer. Fermer A> est sûr d'appeler autant que vous le souhaitez. P>
Une application peut appeler près plus d'une fois. Aucune exception n'est générée. P>
blockQuote>
Toutes les implémentations de idensposables.Disposent code> devrait se comporter bien si elle est appelée plus d'une fois. En outre, les finaliseurs devraient également se comporter de la même manière, car des objets déjà finalisés peuvent être ressuscités et remanisés.
J'ai ajouté un commentaire à la question initiale indiquant pourquoi. Vous trouverez mon nom dans les commentaires de ce poteau de blog, posant la même question - c'est quand j'ai décidé de demander ici. En outre, appeler Dispose code> ou
Fermer code> deux fois sur une connexion de base de données n'est pas le pire qui puisse arriver.
En outre, Point important B>, je ne me demandais pas de compte de référence.
premier appel gc.collect () code> et puis em> vérifier
faimètre.isalive code>. Si c'est
vrai code> (c'est-à-dire, il n'a pas été collecté après avoir appelé gc.collect em>), il y a une référence forte quelque part. P>
+1 pour l'exactitude. Toutefois, si vous appelez GC.Collect pour vérifier les comptes de référence d'objet, vous appuierez des objets dans des générations ultérieures - les faire vivre plus longtemps si vous arrêtez jamais d'invoquer manuellement le GC. En tant que tel - c'est une mauvaise pratique.
Pas techniquement correct. Que forçant une collection de génération-zéro ne garantit pas que l'objet en question sera collecté: il aurait peut-être été promu dans une génération supérieure
Cela ne sera promu qu'une génération supérieure s'il y a encore des références exceptionnelles. Si le GC détermine qu'il n'y a pas de références, cela sera laissé seul ou collecté.
@Tim Robinson Ce n'est pas strictement vrai. Il y a une heuristique impliquée dans la promotion d'objets à des générations supérieures. Ce n'est pas quelque chose que vous pouvez compter maintenant. Et il n'est certainement pas documenté de ne pas changer demain. En outre, les objets jamais i> sont collectés sont un scénario valide (c'est-à-dire le collecteur de déchets NULL code> NULL code> un collecteur de déchets valide). Rien ne dit que le collecteur des ordures doit faire quoi que ce soit lorsque vous appelez collecter code> - c'est un détail de mise en œuvre interne.
@Ian: MSDN dit que GC.Collect "oblige une collecte immédiate des ordures de toutes générations". msdn.microsoft.com/en-us/library/xe0c2357.aspx
@ Dark CIDADE Le GC est autorisé à ne rien faire. En outre, parce que c'est enfilé, c'est une condition de course.
Où dit-il que le gc de .NET ne peut rien faire lorsque vous appelez GC.Collect ()? L'argument null GC de Chen n'est que théorique. Et je ne vois pas comment c'est une condition de race depuis GC.Collect () ne revient pas avant que cela soit terminé la collection.
@Mark CIDADE Il ne dit pas que le GC peut ne rien faire lorsque vous appelez gc.collect () code>; ne dit pas non plus ce que le GC va faire. Il est dit "oblige une collecte immédiate des ordures de toutes générations."). Une optimisation qui est autorisée à exister là où elle ne fait rien ", d'accord, j'ai effectué les opérations de collecte - et j'ai collecté rien puisqu'il n'y a pas de pression de mémoire."
Remarque Vérification Isalive code> pour
true code> est un conditon de course. Voir Remarques dans la documentation: "Parce qu'un objet pourrait potentiellement être récupéré pour la collecte des ordures immédiatement après que la propriété Isalive renvoie true, l'utilisation de cette propriété n'est pas recommandée, sauf si vous ne testez que pour une fausse valeur de retour."
Nous avons créé il y a presque 7 ans que ce n'est pas une méthode fiable.
Pourquoi avez-vous besoin de savoir cela?
"Pour cela, utilisez une faiblesseFerence" - Raymond va faire allusion à
faimérer.Salive code>
@Tim Robinson si
Isalive code> renvoie
true code> Tout ce que je peux déduire est que l'objet a pas b> été collecté. Si
Isalive code> renvoie
false code> Tout ce que je peux déduire est que l'objet a B> été collecté. Je veux savoir si un objet a des "références fortes" à elle. Un objet avec de fortes références ne sera pas collecté, mais tous les objets non collectés ne leur ont pas de fortes références.
Pourquoi j'ai besoin de savoir ça? Je pourrais constituer quelques raisons
1. Code> pour l'amélioration de tout type d'homme d'élargir l'horizon de la connaissance humaine
2. code> Je pratique une thèse sur la dégradation physique Effets d'objets fortement référencés sur la RAM DDR dans des systèmes inhérents.
3. code> Je veux savoir s'il est prudent d'appeler à disposer d'une connexion de base de données.
4. Code> Je veux attraper un bug où quelqu'un référencit un objet, mais je suis sûr que personne ne devrait l'être.
5. Code> Parce que quelqu'un d'autre a demandé, mais les gens ont refusé de répondre à la question.
Le conseil de Mark à appeler
gc.collect; Wr.isalive code> est bon. Le seul moyen sûr de répondre "Où sont toutes les fortes références?" est d'effectuer une collection de déchets. L'alternative pourrait être de suspendre le programme, de suivre vous-même des racines de GC et de traverser les références d'objets vous-même, mais c'est ce que le GC fait de toute façon.