我可以使用自己的扩展方法使对象为空吗?

时间:2012-08-12 14:14:43

标签: c# extension-methods

我向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();
    }

2 个答案:

答案 0 :(得分:4)

只有当“this”参数也是ref参数时,才可能这样做,而不是。

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

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

答案 1 :(得分:4)

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

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

此外,这将非常令人困惑:如果我写timer.DestroyAfter(time),然后突然有一段时间,timer变成null?我当然不会指望那样。