2012-08-12 69 views
2

我写了扩展方法给Timer类,在一段时间后销毁它。似乎它实际上只在timer.enable字段中设置了false,但并未真正将整个事物设置为false。有没有办法从它自己的扩展方法中取消对象?我可以使用自己的扩展方法来删除对象吗?

另一件事是 - 以这种方式实现它的好实践,还是我应该期待同步问题和更多的惊喜?

timer.DestroyAfter(1.Hours()):

 public static void DestroyAfter(this Timer timer, TimeSpan timeSpan) 
     { 
     var killingTimer = new Timer(timeSpan.TotalMilliseconds) 
      { 
       AutoReset = false, 
      }; 

     killingTimer.Elapsed += (sender, e) => 
      { 
       timer.Stop(); 
       **timer = null;** //doesn't seem to work though line is executed 
       killingTimer.Stop(); 
       killingTimer = null; 
      }; 
     killingTimer.Start(); 
    } 

回答

4

这将仅是可能的,如果 “这” 参数也ref参数,这事实并非如此。

所以答案是否定的(在当前的C#实现)

关于你提到的其他问题:有没有错,你实现它的方式(停止计时器并清除参考捕获“killingTimer”变量) 。

+0

Thanks.follow问题 - 因为没有人真的指向了杀死定时器(它的生命周期只在这个函数中) - GC有可能在定时器能够执行其操作之前杀死它吗?我的意思是 - 有没有解释说会杀死定时器将执行其行动? – user1025852 2012-08-13 05:32:47

+0

Th GC不会触及killingTimer,因为它在“Elapsed”事件处理函数的闭包中被捕获和引用。 – 2012-08-13 07:32:47

4

扩展方法没有什么特别之处。 this修饰符说明像timer.DestroyAfter(time)这样的调用应该编译为像编写DestroyAfter(timer, time)一样。

而在常规方法中,更改为参数变量不会影响原始变量。在常规方法中,有一种方法可以实现这一点:使用ref参数。但是你不能用扩展方法的this参数来做到这一点。

此外,这将是非常混乱:如果我写timer.DestroyAfter(time),然后突然在未来的某个时间,timer变成null?我当然不会期望这一点。

相关问题