【发布时间】:2017-01-14 15:30:49
【问题描述】:
我正在尝试在 F# 中创建单例的各种方法,以便我更好地理解其中的细微之处。我不知道单例模式在 F# 中是否有用,但我想尝试一下。我对涉及这些单例实例上的静态构造函数的结果感到惊讶。首先,我将向您展示我的代码,然后我将详细介绍我的问题。
在一个名为TrySingleton 的项目中,我创建了三个模块。这里是Eager.fs:
module TrySingleton.Eager
type EagerClass() =
do
printfn "Initializing eager class..."
static do
printfn "Static constructor of eager class"
let Instance = EagerClass()
这里是Lazy.fs:
module TrySingleton.Lazy
type LazyClass() =
do
printfn "Initializing lazy class..."
static do
printfn "Static constructor of lazy class"
let Instance = lazy LazyClass()
我是这样称呼他们的,Main.fs:
module TrySingleton.Main
[<EntryPoint>]
let main argv =
printfn "Starting main with args %A" argv
printfn "Accessing eager instance:"
printfn "%A" Eager.Instance
printfn "Accessing lazy instance:"
printfn "%A" Lazy.Instance.Value
printfn "Accessing eager instance again:"
printfn "%A" Eager.Instance
printfn "Accessing lazy instance again:"
printfn "%A" Lazy.Instance.Value
printfn "Success; exiting."
0
我期待Eager 类的静态构造函数在程序启动时立即运行,但不确定Lazy 类的静态构造函数何时运行。但是,这是我得到的输出:
Starting main with args [||]
Accessing eager instance:
Static constructor of eager class
Initializing eager class...
TrySingleton.Eager+EagerClass
Accessing lazy instance:
Static constructor of lazy class
Initializing lazy class...
TrySingleton.Lazy+LazyClass
Accessing eager instance again:
TrySingleton.Eager+EagerClass
Accessing lazy instance again:
TrySingleton.Lazy+LazyClass
Success; exiting.
看来Eager 课程并不像我想象的那么急切。它的静态构造函数只在我第一次尝试访问实例时运行,而我认为静态类构造函数会在程序启动时运行。
我想我没有太多问题了,除了问:这是否记录在任何地方?我错过了哪些关于何时运行类的静态构造函数的文档?
【问题讨论】:
标签: constructor static f# singleton lazy-loading