2012-08-12 62 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?我當然不會期望這一點。

相關問題