Как удалить экземпляр класса? - PullRequest
3 голосов
/ 20 июня 2010

Итак, у меня есть проект, который создает несколько экземпляров класса и перечисляет их.

В какой-то момент экземпляр класса больше не нужен. Как я могу это промыть?

Пока этого не происходит, даже когда класс больше не имеет ничего общего (если бы это был один статический класс, программа закрылась бы), он все еще находится в моем списке, и его открытые переменные еще доступно ...

Ответы [ 5 ]

4 голосов
/ 20 июня 2010

Ваш вопрос подразумевает, что у вас есть эти экземпляры в каком-то списке.Удалите экземпляры, которые вам больше не нужны, из списка, убедившись, что у вас нет других ссылок на них.В какой-то момент сборщик мусора вернет их.

4 голосов
/ 20 июня 2010

Почему забота, чтобы смыть это? Почему бы просто не позволить .Net Сборке мусора сделать свое дело?

В качестве альтернативы вы можете реализовать IDisposable и вызвать

MyClass.Dispose();

ОБНОВЛЕНИЕ: Звучит так, будто вы хотите пользовательскую коллекцию, а не список, которая будет возвращать только активные классы. Создайте новый класс MyClassCollection, который реализует ICollection , и убедитесь, что он только когда-либо возвращает активные классы

3 голосов
/ 20 июня 2010

Ваши экземпляры могут вызывать событие (скажем, OnInactivation). Класс списка должен добавить обработчик для таких событий, когда элемент добавляется в список (создайте подкласс или инкапсулируйте список и переопределите метод Add). Когда событие происходит, объект будет удален из списка списком. Если предположить, что объект не указан ни в каких других списках (которые также могут прослушиваться), сборщик мусора может свободно работать с объектом.

Таким образом, объект не должен отслеживать все ссылки на себя и знать, как сообщить владельцу ссылки, чтобы освободить ссылку.

Вот работающий пример: http://www.coderun.com/ide/?w=Hw83i0wAQkugUif5Oj2lmw

2 голосов
/ 20 июня 2010

Пример для объяснения того, что должно произойти:

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 голосов
/ 20 июня 2010

Более общее решение для ссылок на объекты без предотвращения их сборки мусора заключается в использовании WeakReference .

...