2010-08-16 51 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