2010-08-16 25 views
2

考慮以下幾點:F#:模塊let和類型static let有何區別?

module MyModule = 
    let myObj = new MyObj() 

type MyType() = 
    static let myObj_ = new MyObj() 
    static member myObj = myObj_ 

...是MyModule.myObj和MyType.myObj功能(沒有雙關語意)相同呢?

每當我調用MyModule.myObj或MyType.myObj時,我不希望代碼實際創建一個新對象。我只想訪問單例對象上的方法。我希望上面的任何一個都適合這個目的。

+0

你可以打開你的MyType嗎? – 2010-08-16 14:19:04

回答

4

試試看吧?我認爲它們是相同的,但我認爲你可以使用構造函數創建一個MyObj類型來打​​印某些內容,然後使用簡短的測試程序輕鬆驗證行爲。 (或者也許你在問我另外一些我不清楚的東西。)

+0

好主意,Brian。我試了一下,在()構造函數中插入了對System.Windows.MessageBox.Show(string)的調用。當我將MyModule.myObj或MyType.myObj賦值給某個值時,消息框並未出現;它只在單身人士初始化時出現,所以它確實看起來像兩種方法是等價的。感謝您的建議! – MiloDC 2010-08-16 04:41:17

1

在這兩種情況下,對象肯定只能創建一次。

雖然有一個小的(理論上的)區別。通過靜態放置,只能保證在第一次使用MyType之前創建對象(MSDN)。

模塊級的let綁定可能在程序啓動時執行(或者可能是在第一次使用模塊時)。

+0

有趣。好的信息,謝謝wmeyer! – MiloDC 2010-08-17 05:57:34