Ind*_*ore 5 c# microsoft-metro windows-8
我已经订阅各种事件OnNavigatedTo像
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Loaded += Screen_Loaded;
}
Run Code Online (Sandbox Code Playgroud)
我没有取消订阅此活动.不需要此页面时是否会导致内存问题?
不。在这种情况下,您不需要取消订阅以避免内存泄漏。原因是您订阅了 上的事件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)
| 归档时间: |
|
| 查看次数: |
226 次 |
| 最近记录: |