7
votes

Comment appeler Destructor en C # Xna

J'ai un objet et je veux simplement le détruire sur un événement. Comment appeler le destructeur dans Xna?


0 commentaires

7 Réponses :


1
votes

Définir la référence à cet objet à null .


0 commentaires

6
votes

Définissez l'objet sur null et le collecteur de déchets le ramassera sur son prochain exécution.

comme une note latérale, si l'objet est quelque chose que vous créez souvent (ennemis, balles, etc.), vous voudrez peut-être utiliser un piscine au lieu de supprimer l'objet. Cela signifierait que cet objet est recyclé et que le collecteur des ordures est appelé moins souvent, ce qui augmentera les performances.


10 commentaires

Omg, c'est la dernière chose que vous voulez faire dans .net


foreach (kour dym dans Smokelist) {dym.cas + = gamétime.elapsedgametime; if (dymp.cas> tispan.fromseconds (0.5)) {dym = null; }}


@Nick Berardi - Pourriez-vous expliquer pourquoi s'il vous plaît, puisqu'il s'agit-il d'un bowvote? Pourquoi référencer un petit nombre d'objet à null et la recommandation de l'utilisation d'un pool La dernière chose que vous voulez faire? @Nassgharet - Qu'est-ce qui ne fonctionne pas? En outre, Smokelist ressemble à un système de particules. Vous devez utiliser la mise en commun, pas null sur tous les objets si c'est le cas.


Parce que comme @nasgharet a indiqué définir un objet sur null ne fait que la mémoire .NET sage, c'était une idée fausse commune apportée des jours C et C ++ de certains programmeurs. Le seul moyen de mettre un objet sur un processus de finalisation pour le GC est de le laisser tomber hors de portée.


@Nashgharet La raison pour laquelle il ne fonctionne pas dans votre cas est que le gestionnaire d'événements conserve l'objet dans la portée car l'événement n'est jamais débouché de l'objet. Vous devez appeler - = pour supprimer l'événement avant de pouvoir être collecté.


@Nick Berardi - Non, il n'a pas d'effet immédiat sur la mémoire. La question était de détruire l'objet (c'est-à-dire perdre référence) dans le jeu (puisque c'est xna ). Le motif isisposable est certainement valable pour l'élimination, mais OP n'était pas préoccupé par la suppression de la mémoire, détruisant plutôt l'objet. Forcer le GC est insouciant dans un jeu en temps réel (ESP sur Xbox / WP7) et la mise en commun est toujours meilleur que disposant (Common Objs). Il n'y a pas besoin de définir comme NULL à partir d'une perspective de mémoire nécessairement, mais cela aide lorsque vous essayez de supprimer un ennemi du jeu. Quand une balle sortait-elle automatiquement?


Voir cet exemple sur mon commentaire pour utiliser comment utiliser des références faibles au lieu des fortes références que vous utilisez actuellement avec votre gestionnaire d'événements. Stackoverflow.com / Questions / 6269427 / ...


@KeyboardP de quoi vous parlez est des considérations de conception et non le nettoyage de la mémoire, et 2e l'exemple qu'il a donné ne libérera jamais la dym objet jusqu'à ce que l'objet gamétime a été libéré, en raison de la forte référence créée par le gestionnaire d'événements. Il s'agit d'un problème courant que les modèles entraînés par l'événement provoquent, alors même si vous le définissez sur null , il ne sera pas libéré que gamétime est libéré.


@Nick Berardi - Je suppose que nous avons transversalement câblé. J'ai supposé que l'OP lui demandait une perspective de se débarrasser d'un objet du jeu, pas nécessairement de la mémoire POV. C'est pourquoi j'ai suggéré de mettre en commun, surtout si vous allez en boucle sur les objets (il y a de fortes chances, il existe de nombreuses quantités).


@KeyboardP Pourquoi pensez-vous que l'on voudrait même jamais vouloir détruire l'objet ? Il s'agit de faire des choses qui doivent être faites après la disparition de l'objet - c'est-à-dire des descripteurs de réseau / fichier proches, etc. Afaik c # n'a toujours pas un moyen de faire cela (il y a une solution de contournement avec Idisposable, mais c'est très Error-Preone, car le compilateur ne prévoit même pas de programmeur à utiliser en utilisant avec de telles classes) .



0
votes

Après avoir défini l'objet sur null , si vous voulez pour une raison quelconque, l'objet à collecter immédiatement, appelez gc.collect () . .


3 commentaires

Pas de bons conseils génériques. Appeler GC.Collect ne garantit pas qu'il collectera de toute façon et peut en réalité finir par créer plus de problèmes que ce qu'il vaut la peine.


@Gregory A Beamer de MSDN sur GC.Collect : "Force une collection immédiate des ordures de toutes générations." . Bien sûr, tout dépend d'une situation si gc.collect devrait être appelé ou non. Par exemple. Si un objet consomme beaucoup de mémoire qui devrait être libéré aussi vite que possible, gc.collect est utile.


Laissez-moi ammer ma déclaration énoncée à la hâte. GC PAS GUERANTEIVER DE NETTOYER DES OBJETS UPS. J'aime les règles de Rico pour la collecte des ordures: blogs.msdn. COM / B / RICOM / Archive / 2004/11/29/71829.aspx



3
votes

Bien que votre kilométrage puisse varier, ma préférence est d'utiliser Idisposable et Dispose () d'objets que je n'avais plus besoin. Ceci est esp. True lorsque vous utilisez des ressources non gérées, mais que vous avez le Dispose () configuré déclare l'intention.

Voir cette ressource sur gc.suppressfinalize pour un bon exemple de comment implémenter Idisposable .

http://msdn.microsoft.com/fr- US / Bibliothèque / System.GC.SuppressFinalize.aspx


1 commentaires

En plus d'utiliser simplement l'utilisation, vous pouvez aller de l'avant et suivre le motif jetable afin que vous puissiez libérer de l'objet à volonté, mais s'il est hors de portée, il est pris en charge par le GC.



0
votes

Quel genre d'objet? Si vous êtes disponible / Idisposable, vous devez appeler objet.Dispose () Sinon, vous pouvez simplement utiliser objet = null, et il sera "nettoyé" automatiquement. Ce n'est pas c vous travaillez dans;)

Si votre «objet» est en fait une classe complexe ou quelque chose avec plus d'objets, vous voudrez peut-être envisager de le faire une classe isisposable.


0 commentaires

0
votes

Si l'objet détient toutes les ressources non gérées, implémentez Idisposable (et utilisez à l'aide de ou appelez jetez () dessus lorsque vous avez terminé avec elle).

S'il ne contient pas de ressources non gérées, le collecteur des ordures le prétendra "à un moment donné" lorsqu'il n'y a plus de références à cela.

GC.Collect () rendra le collecteur des ordures collectant et il "détruire" votre objet s'il n'y a pas de références à cela. Ce n'est pas une très bonne idée puisqu'il a des conséquences sur la performance (il faut du temps et favorise d'autres objets dans une génération plus élevée qui les rendent plus longtemps en mémoire avant d'être récupéré).

Pourquoi avez-vous besoin de l'objet détruit à un certain temps fixe?


0 commentaires

0
votes

Ce que vous voulez faire est d'appeler gc. Suppropefinisize () Code> Si vous gérez le nettoyage vous-même ... Habituellement, vous utilisez gc.suppressfinalize () code> dans un classe Idisposable code>. Voir cet exemple de code pour l'utilisation courante de Idisposable code>:

http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx p>

Si vous avez vraiment besoin de prendre des ordures recueillies correctement Suivant: P>

dym.cas += gameTime.ElapsedGameTime;


0 commentaires