2011-01-18 7 views
4

Quelle est la meilleure façon d'effacer un objet:Comment "effacer" un objet?

1) une méthode dans la classe qui efface tous les membres de la classe: MyObject.Clear();

2) Dans mon code, dans la logique métier, null la objet: MyObject = null;

+3

3) Laisser tomber la référence et faire une nouvelle un? – spender

+0

Voulez-vous dire une fois que l'objet a été éliminé ou lorsque vous essayez d'indiquer que l'objet ne contient plus d'informations pertinentes? – rjzii

+0

J'aime la suggestion de spender. MyObject est-il cher à construire? – n8wrl

Répondre

12

Ils font des choses différentes. Définir une variable à null ne fait rien à l'objet lui-même. Cela peut signifier que l'objet est désormais éligible pour la récupération de place, mais cela ne fera aucune différence s'il existe d'autres références "en direct" au même objet.

Que devriez-vous faire? Eh bien, cela dépend entièrement de votre situation. Si vous avez beaucoup d'endroits différents en référence au même objet, et qu'ils doivent tous voir la "clairance", alors modifiez l'objet. Si vous avez juste besoin d'une variable pour faire référence à un objet différent ou pas du tout, changez simplement la valeur de la variable. L'important est de connaître la différence entre les deux - soyez très conscient que la valeur d'une variable n'est jamais objet ... c'est soit une valeur de référence, soit une valeur de type.

1

Deuxième. Veillez à ne conserver aucune référence à votre objet. Tous les gestionnaires d'événements liés, les références dans les collections rendent votre instance "unfreeable".

Si vous venez de C++, ne vous embêtez pas avec Garbage Collector. Je suis conscient que l'obsession de la performance de la mémoire peut conduire à manipuler le processus de collecte de la mémoire. En fait, vous ne devriez jamais avoir besoin de l'utiliser. Juste déconnecter les références.

3

Je recommanderais simplement de construire une nouvelle instance de l'objet, au lieu de l'effacer.

Si vous avez terminé avec un objet, mais pas avec la classe contenant sa référence, il peut être approprié de le définir sur null. Cependant, si c'est juste utilisé dans une méthode, vous n'avez rien à faire (le ramasse-miettes le nettoiera quelque temps après qu'il n'y ait aucune référence à l'objet) - laissez-le simplement "partir" en le laissant tomber de portée. Si c'est dans une collection, vous pouvez simplement le retirer de la collection. La seule exception est l'implémentation de l'objet IDisposable. Dans ce cas, vous pouvez appeler sa méthode Dispose() ou essayer de structurer votre code pour l'utiliser dans un bloc using, afin que ses ressources soient nettoyées correctement.

0

La réponse à votre question est «ça dépend». Cela dépend de ce que vous essayez d'en faire. Si vous voulez conserver une référence à cette instance particulière (c'est-à-dire que d'autres y font référence, ou la construire coûte cher), alors vous êtes probablement mieux avec une méthode Clear. Mais seulement si vous continuez à utiliser cette instance d'objet particulière.

Si vous ne vous souciez plus d'un objet, arrêtez simplement de vous y référer. En général, vous n'avez pas besoin de le définir sur null, car le générateur de code peut déterminer la durée de vie de l'objet et rendre l'objet disponible pour la récupération de place. Mais si vous voulez vous assurer que l'objet est collecté dès que possible (c'est-à-dire lors du prochain cycle de collecte des ordures), alors le réglage MyObject = null est le chemin à parcourir. Encore une fois, ce n'est normalement pas nécessaire, mais cela ne nuira à rien.

0

Je ne pense pas.Tout en travaillant avec C# cours de langue, nous avons GC (garbage collection) pour promouvoir un changement dans ce très difficile, si vous utilisez C + +, il s'est avéré très facile