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