我有一个F#类,它派生自一个带有多个构造函数的.net类。为了公开它们,我实现了一个没有主构造函数的类型。现在我想添加一个静态字段。如何初始化静态字段?考虑一下:
type MyType =
inherit DotNetType
[<DefaultValue>] static val mutable private myStatic : int
new () = { inherit DotNetType() }
new (someArg:string) = { inherit DotNetType(someArg) }
现在,我如何初始化&#34; myStatic&#34;如果使用了类型,那么字段只运行一次,如果从未使用过类型,则根本不运行?基本上,我需要等效的C#静态构造函数块。
答案 0 :(得分:4)
请参阅F# spec, 8.6.3类中的其他对象构造函数部分:
对于没有主构造函数的类,副作用可以是 在对象的字段初始化之后执行 使用
additional-constr-expr then stmt
表单。
示例:
type MyType =
inherit DotNetType
[<DefaultValue>] static val mutable private myStatic : int
new () = { inherit DotNetType() } then MyType.myStatic <- 1
new (someArg:string) = { inherit DotNetType(someArg) }
static member Peek = MyType.myStatic
MyType.Peek |> printfn "%d" // prints 0
MyType() |> ignore
MyType.Peek |> printfn "%d" // prints 1
答案 1 :(得分:1)
我和OP有同样的疑惑,我不喜欢唯一接受的答案。在我的情况下,我最终做的只是在let
元素中使用普通字段(通过module
),而不是type
元素。