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

2 回答 2

4

这只有在“this”参数也是 ref 参数时才有可能,而事实并非如此。

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

关于您的另一个问题:您实现它的方式没有任何问题(停止计时器并清除对捕获的“killingTimer”变量的引用)。

于 2012-08-12T14:18:16.073 回答
4

扩展方法没有什么特别之处。this修饰符所说的 call like应该timer.DestroyAfter(time)像你写的那样编译DestroyAfter(timer, time)

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

此外,这将非常令人困惑:如果我写timer.DestroyAfter(time),那么在未来的某个时间突然timer变成null? 我当然不会期待。

于 2012-08-12T14:20:18.030 回答