2010-06-20 6 views
3

J'ai donc ce projet qui crée plusieurs instances d'une classe et les liste.Comment supprimer une instance d'une classe?

À un certain point, la classe instanciée n'est plus nécessaire. Comment puis-je le vider? Jusqu'ici, ça n'arrive pas, même quand la classe n'a plus rien à faire (si c'était une seule classe statique, le programme se serait arrêté), c'est toujours dans ma liste, et ses variables publiques sont toujours disponibles ...

+0

Quoi? Il deviendra "indisponible" quand il sortira du champ d'application. Quelle est la portée de celui-ci? Statique? Ensuite, il ne sera jamais hors de portée ... –

+1

En supposant que vous n'allouez aucune ressource non managée, le récupérateur de place doit prendre soin de lui à temps (quand il veut, mais il récupèrera cette mémoire - pas besoin de forcer une collection). – Pwninstein

+2

Il semble que vous ne compreniez tout simplement pas la récupération de place. Vous devriez aller droit au but avant de sortir de votre façon de faire ce que .NET fait déjà pour vous. –

Répondre

3

Vous pouvez demander à vos instances de déclencher un événement (Activé, par exemple). La classe list doit ajouter un gestionnaire pour ces événements lorsque l'élément est ajouté à la liste (sous-classe ou encapsuler une liste et remplacer la méthode Add). Lorsque l'événement se déclenche, l'objet est supprimé de la liste par la liste. En supposant que l'objet n'est référencé dans aucune autre liste (qui peut également être à l'écoute), le garbage collector est libre de gérer l'objet. De cette manière, l'objet n'a pas besoin de garder une trace de toutes les références à lui-même, et sait comment informer le détenteur de référence pour libérer la référence.

Voici un exemple runnable: http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw

+0

+1 J'ai posté un message similaire à celui sur la réponse @ Brian. – slugster

+0

Merci, ça a du sens, je vais essayer de l'implémenter. – Ben

+1

@Ben - J'ai ajouté un lien vers un exemple exécutable. –

4

Pourquoi le souci de le rincer? Pourquoi ne pas simplement laisser .Net Garbage Collection le faire?

Altenatively vous pouvez mettre en œuvre IDisposable et appelez

MyClass.Dispose(); 

MISE À JOUR: On dirait que vous voulez une collection personnalisée, pas une liste, qui renvoie uniquement les classes actives. Créez une nouvelle classe appelée MyClassCollection qui implémente ICollection et assurez-vous qu'elle ne renvoie que des classes actives.

+0

J'ai besoin de la liste pour être à jour avec seulement les classes actives, et ne pas tenir compte des inactifs. – Ben

+0

@Ben Qu'entendez-vous par "classes actives"? – Pwninstein

4

Votre question implique que vous avez ces instances dans une liste quelconque. Supprimez les instances que vous ne voulez plus de la liste, en vous assurant de ne pas avoir d'autres références à celles-ci. À un moment donné, le garbage collector les récupèrera.

+0

Donc, la classe qui devient inactive doit en quelque sorte avertir la classe qui détient la liste pour la retirer ... afin que le garbage collector puisse s'en débarrasser ... err ... non? :) – Ben

+0

Si c'est ainsi que votre application est organisée, oui. –

+1

@Ben, peut-être que vous ne nous avez pas donné toutes les informations? Comment savons-nous quand ces classes sont devenues inactives?Si l'objet devait déclencher un événement pour dire "hey, je n'ai plus de travail à faire, je ne suis plus actif" *? – slugster

2

exemple pour expliquer ce qui devrait nous l'espérons arriver:

public class MyClass { 
    public string MyString { get; private set; } 
    public int MyInt { get; private set; } 
    public double MyDouble { get; private set; } 

    public MyClass(string myString, int myInt, double myDouble){ 
     MyString = myString; 
     MyInt = myInt; 
     MyDouble = myDouble; 
    } 
} 

public class SomeOtherClass{ 
    public List<MyClass> m_Instances = new List<MyClass>(); 

    public void FillList(){ 
     //Instantiate 3 items, and add to the list 
     m_Instances.Add(new MyClass("1", 2, 3d)); 
     m_Instances.Add(new MyClass("4", 5, 6d)); 
     m_Instances.Add(new MyClass("7", 8, 9d)); 
    } 

    public void RemoveFirst(){ 
     //Remove the first one. As long as the removed item has no 
     //other instances, the Garbage Collector will (in its own time) 
     //destroy that unused object, and reclaim the memory. 
     m_Instances.RemoveAt(0); 
    } 
} 
0

Une solution plus générale pour référencer des objets sans empêcher leur collecte des ordures est d'utiliser un WeakReference.

Questions connexes