.net C # вопрос сбора мусора - PullRequest
       15

.net C # вопрос сбора мусора

0 голосов
/ 08 декабря 2010

У меня простой вопрос о сборке мусора .net. В следующем коде я создаю экземпляр класса слушателя в конструкторе дочернего объекта. Мой вопрос заключается в том, получает ли класс слушателя сборщик мусора перед дочерним или главным объектом, поскольку на него нет прямой ссылки?

class MainObject
{
    public void DoSomething()
    {

    }
}

delegate void someEventHandler();
class ChildObject
{
    public event someEventHandler SomeEvent;
    MainObject main;
    public ChildObject(MainObject main)
    {
        this.main = main;
        new Listener(this, main);
    }
}


class Listener
{
    MainObject main;

    public Listener(ChildObject child, MainObject main)
    {
        this.main = main;
        child.SomeEvent += new someEventHandler(child_SomeEvent);
    }
    void child_SomeEvent()
    {
        main.DoSomething();
    }
}

Ответы [ 3 ]

6 голосов
/ 08 декабря 2010

Там - это ссылка на него, в списке вызовов child.SomeEvent.

Повисшие обработчики событий - причина номер один для утечек памяти в приложениях .NET.

Он будет собран после того, как объект child собран, но если вы хотите, чтобы он был собран заранее, вам необходимо удалить его из списка вызовов (с помощью оператора -=).

2 голосов
/ 08 декабря 2010

Цель GC - не беспокоиться о том, когда что-то будет собрано. Их собирают, когда они больше не нужны и не в определенном порядке. Невозможно гарантировать сбор одного объекта перед другим объектом.

1 голос
/ 08 декабря 2010

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

http://msdn.microsoft.com/en-us/library/aa970850.aspx

...