2013-09-30 44 views
0

我在構造函數中創建了一個計時器,並且希望使該計時器成爲構造類的成員。由於定時器沒有被任何其他類成員引用,它被編譯成一個變量,這個變量對構造函數是本地的,因此垃圾被收集並被殺死。防止這種情況發生的如何在構造函數中創建一個本地構造函數變量

一種方法是做一個虛擬的參考,像

type MyClass() as o = 
    let timer = new Timer((fun _ -> o.Tick()), null, 0, 1000) 

    member private o.DummyRef = timer 
    member o.Tick() = printfn "Tick!" 

是否有強迫timer到成爲一名成員的更合適的方法?

回答

5

如果你希望它是一個成員,那麼let是錯誤的工作工具,因爲,according to the spec,編譯格式(局部變量或字段)是由編譯器來決定。你可能想要一個私人財產:

type MyClass() as o = 
    member val private Timer = new Timer((fun _ -> o.Tick()), null, 0, 1000) 
+0

Thx! 'member'是我尋找的神奇詞彙。我正在考慮'val timer:Timer'語法,但是我必須使用[],使其變爲可變的並將其分配在ctor do塊中。 –

1

由於您在任何地方都不使用timer,因此它正在針對本地構造函數進行優化。如果你想在你的類型定義的其他地方使用它,那麼它將被編譯爲類的字段。例如

type MyClass() as o = 
    let timer = new Timer((fun _ -> o.Tick()), null, 0, 1000) 

    member o.Tick() = printfn "Tick" 

    interface IDisposable with 
     member x.Dispose() = timer.Dispose() 
+0

我知道。我已經在問題中寫下了所有這些。順便說一句,問題中的代碼*在其他地方使用定時器。 –

+0

是的,但你只是用它來強制編譯器做你想做的。我只是建議在一個更完整的類型定義中,你可能不必擔心它。 –

相關問題