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修飾子が言うように、呼び出しのようにtimer.DestroyAfter(time)、あなたが書いたかのようにコンパイルする必要がありますDestroyAfter(timer, time)

また、通常の方法では、パラメーター変数を変更しても元の変数には影響しません。通常の方法では、それを達成する方法があります:refパラメータを使用します。thisしかし、拡張メソッドのパラメーターではそれを行うことはできません。

その上、これは非常に紛らわしいでしょう:私が書くならばtimer.DestroyAfter(time)、それから将来のある時突然、timerなりnullますか?私は確かにそれを期待していません。

于 2012-08-12T14:20:18.030 に答える