【问题标题】:Clarification about variable scope and event handlers [duplicate]关于变量范围和事件处理程序的说明[重复]
【发布时间】:2017-03-14 16:41:57
【问题描述】:

请考虑一下这个简单的功能:

public void BeginFade() 
{
    var fade = new DoubleAnimation(0d, TimeSpan.FromSeconds(1));
    fade.Completed += Fade_Completed;
    grid.BeginAnimation(OpacityProperty, fade);
}

var fade 的范围是函数BeginFade,据我了解,当DoubleAnimation 类完成其任务时,框架会自动清除资源。

这对吗?

那么事件处理程序呢?当我调用更多次BeginFade() 时,事件Completed 会发生什么?

这个例子只是为了更好地理解底层行为。当然我可以将fade声明为类成员,并在构造函数中设置事件Completed...

【问题讨论】:

  • 已经完成了它的任务,Framework会自动清除资源---也许不会,clr也会检查它的引用
  • 这取决于您的网格是否保留对淡入淡出的引用。如果是,则无法清除。
  • 您将fade 传递给BeginAnimation,所以一般来说您现在不知道它何时会被垃圾收集,因为BeginAnimation(理论上)可能会将其存储在静态字段中或以其他方式保留参考它。至于已完成的事件——它会发生什么?每次调用 BeginFade 时,fade 都是新的,Completed 事件也是如此。

标签: c#


【解决方案1】:

所以你的fade 被传递给BeginAnimation,这意味着你无法知道它什么时候会被处理掉。但我认为在这种情况下,你的猜测是正确的。

每次调用BeginFade 时,您都会创建新的fade 对象,然后Fade_Completed 事件处理程序订阅其Completed 事件。所以你的每一个fade 动画都只有一个Fade_Completed 订阅。如果这是您所要求的,那不会阻止 fade 对象被垃圾收集。

【讨论】:

  • 是的,这就是我要问的。但就像其他 cmets 建议的那样,最好将 fade 声明为类成员,以便更好地控制发生的事情。
  • @Mark 没有理由将其声明为类成员,您现在所做的很好(我假设那是 WPF 动画)。
  • 是的!再次感谢。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 2015-11-28
  • 2019-12-14
相关资源
最近更新 更多