在F#中,如何在没有主构造函数的类型中初始化静态字段?

时间:2015-09-06 03:26:21

标签: f# c#-to-f#

我有一个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#静态构造函数块。

2 个答案:

答案 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元素。