Я думаю, что это вопрос начального уровня С#, но я не могу найти правильное решение.
У меня есть объект ClassOne, который определяет событие. Я создаю объект ClassTwo, который считается черным ящиком, что означает, что я не знаю, будет ли он регистрироваться на какое-либо событие или нет. Конструктор ClassTwo регистрирует событие ClassOne. Проблема возникает, когда объект ClassTwo выходит за рамки. Сборщик мусора никогда не удаляет этот объект, потому что он никогда не регистрировал событие.
У меня есть два вопроса:
-
Есть ли способ для объекта ClassTwo знать, когда он выходит из области видимости? Для старого программиста на С++ это будет в деструкторе, но с С# это не сработает.
-
Есть ли инструмент отладки, который помогает мне находить такие объекты?
Вот пример кода для воспроизведения проблемы:
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");
}
}