gpt4 book ai didi

c# - GC 何时可以收集挂接到事件的 Lambda?

转载 作者:太空狗 更新时间:2023-10-29 23:37:54 25 4
gpt4 key购买 nike

如果我像这样将 Lambda 连接到事件:

static void DoSomething(Control control)
{
control.SomeEvent += StaticMethodThatHandlesEvent;
Control parentControl = control.Parent;
parentControl.Disposed += (sender, args) =>
{
control.SomeEvent -= StaticMethodThatHandlesEvent;
};
}

在什么条件下可以收集lambda?收了parentControl会收吗?是否可以收集 parentControl(假设它已被妥善处置并且我的代码中没有任何对它的引用)?

编辑:整个代码都在一个静态类中。这相关吗?

最佳答案

当你有这样的问题时,尝试不用匿名方法来做,看看它需要什么才能工作:

internal class Program {
private static void Main(string[] args) {
DoSomething(new Control() {Parent = new Control()});
}

private static void DoSomething(Control control) {
control.SomeEvent += MethodThatHandlesEvent;
Control parentControl = control.Parent;
parentControl.Disposed += new LambdaClass(control).OnDisposed;
}

private class LambdaClass {
private readonly Control _control;
public LambdaClass(Control control) {
_control = control;
}

public void OnDisposed(object sender, EventArgs e) {
// if MethodThatHandlerEvent is not static, you also need to pass and store reference to the wrapping class
_control.SomeEvent -= MethodThatHandlesEvent;
}
}


private static void MethodThatHandlesEvent(object sender, EventArgs e) {

}

private class Control {
public event EventHandler SomeEvent;
public event EventHandler Disposed;
public Control Parent { get; set; }
}
}

现在你有同样的情况,但没有任何匿名方法。提出您的问题 - 控件和 parentControl 已经相互引用,因此添加一个从 parentControl 到控件的间接引用(通过 LambdaClass)不会改变情况。 parentControl 和 control(以及 LambdaClass 的实例)都应该由 GC 收集,因为根(locals、statics 等)中没有对它们的其他引用。 .NET GC 可以毫无问题地收集循环引用。

关于c# - GC 何时可以收集挂接到事件的 Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32494597/

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