gpt4 book ai didi

c# - 我是否需要取消订阅 c# metro 应用程序中的事件?

转载 作者:太空狗 更新时间:2023-10-29 23:16:19 24 4
gpt4 key购买 nike

我已经订阅了 OnNavigatedTo 中的各种事件,例如

protected override void OnNavigatedTo(NavigationEventArgs e)
{
Loaded += Screen_Loaded;
}

我还没有退订这个事件。不需要此页面时会导致任何内存问题吗??

最佳答案

。在这种情况下,您不需要取消订阅以避免内存泄漏。原因是您在 this 上订阅了一个事件。垃圾收集器必须识别并释放该对象。

但是,出于其他原因我还是会退订。例如,拥有平衡的资源会使代码更易于阅读。另外,如果 OnNavigatedTo 被调用两次怎么办? (实际上不知道这是否会发生)然后您将对同一方法有两个订阅。有些人会争辩说,在这种情况下取​​消订阅是冗余代码并删除它。尽管这样是正确的,但我会反对这样的论点。

您可以尝试这个简短的片段来亲自尝试一下。注意:永远不要使用终结器或 GC.Collect(),除非像本例中那样了解 GC。

public class Program
{
private class Foo
{
public event EventHandler FooChanged;

~Foo()
{
Console.WriteLine("Foo was collected");
}

public void Bar()
{
FooChanged += UpdateUI;
}

private void UpdateUI(object sender, EventArgs e)
{
}
}

public static void Main(string[] args)
{
var foo = new Foo();
foo.Bar();
foo = null;
GC.Collect();
GC.WaitForPendingFinalizers();
Console.WriteLine("End of program");
Console.ReadKey();
}
}

关于c# - 我是否需要取消订阅 c# metro 应用程序中的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13813793/

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