gpt4 book ai didi

c# - 对象没有得到垃圾收集

转载 作者:可可西里 更新时间:2023-11-01 08:10:11 27 4
gpt4 key购买 nike

我认为这是一个 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");
}
}

最佳答案

我会在这样的对象上实现 IDisposable 并在 Dispose 方法中注销事件。你会像这样使用你的对象:

using(var two = new ClassTwo(classOne))
{
// Do something with two
}
// object can now be garbage collected.

如果调用者未能调用 Dispose,那你就不走运了。

关于c# - 对象没有得到垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6818098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com