我是否需要取消订阅ac#metro应用程序中的活动?

Ind*_*ore 5 c# microsoft-metro windows-8

我已经订阅各种事件OnNavigatedTo

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    Loaded += Screen_Loaded;
}
Run Code Online (Sandbox Code Playgroud)

我没有取消订阅此活动.不需要此页面时是否会导致内存问题?

vid*_*ige 2

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

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

您可以尝试这个简短的片段来亲自尝试一下。注意:切勿使用终结器,除非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();
    }
}
Run Code Online (Sandbox Code Playgroud)