F#:模块let和type static之间有什么区别?

时间:2010-08-16 03:31:20

标签: f# static module singleton types

鉴于以下内容:

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时,我都不希望代码实际创建新对象。我只想访问单例对象上的方法。我希望上述任何一个都适合这个目的。

2 个答案:

答案 0 :(得分:4)

试试看?我认为这些是相同的,但我认为你可以使用构造函数创建一个MyObj类型,该构造函数可以打印一些东西,然后通过一个简短的测试程序轻松验证行为。 (或者你可能会问一些我不清楚的事情。)

答案 1 :(得分:1)

在这两种情况下,对象肯定只创建一次。

虽然存在一些小的(理论上的)差异。使用静态let,只保证在第一次使用MyType之前创建对象(MSDN)。

模块级let绑定可能在程序启动时执行(或者可能在首次使用模块时执行?)。