Объект не получает сборщик мусора

Я думаю, что это вопрос новичка в C #, но я не могу найти правильного решения.

У меня есть объект ClassOne, который определяет событие. Я создаю объект ClassTwo, который считается черным ящиком, что означает, что я не знаю, будет ли он регистрироваться на какое-либо событие или нет. Конструктор ClassTwo регистрируется в событии ClassOne. Проблема возникает, когда объект ClassTwo выходит за пределы области видимости. Сборщик мусора никогда не удаляет этот объект, потому что он никогда не отменял регистрацию события.

Итак, у меня есть два вопроса:

  1. Есть ли способ для объекта ClassTwo узнать, когда он выходит за пределы области видимости? Для старого программиста на C ++ это было бы в деструкторе, но с C # это не работает.

  2. Есть ли инструмент отладки, который поможет мне найти такие объекты?

Вот пример кода для воспроизведения проблемы:

    public partial class MainWindow : Window
{
    static public ClassOne classOne = new ClassOne();
    public MainWindow()
    {
        InitializeComponent();
        ClassTwo classtwo = new ClassTwo();
    }

    private void buttonTest_Click(object sender, RoutedEventArgs e)
    {
        GC.Collect();
    }
}
public class ClassOne
{
    public ClassOne()
    {
        Trace.WriteLine(this + " constructor");
    }

    ~ClassOne()
    {
        Trace.WriteLine(this + " destructor");
    }

    public delegate void UpdateFunc(object sender, EventArgs args);
    public event UpdateFunc OnUpdate;

}
public class ClassTwo
{
    public ClassTwo()
    {
        Trace.WriteLine(this + " constructor");
        MainWindow.classOne.OnUpdate += new ClassOne.UpdateFunc(classOne_OnUpdate);
    }

    void classOne_OnUpdate(object sender, EventArgs args)
    {
        throw new NotImplementedException();
    }

    ~ClassTwo()
    {
        Trace.WriteLine(this + " destructor");
    }
}
13
задан MTR 25 July 2011 в 14:59
поделиться