2015-09-06 15 views
7

我有一個F#類派生自一個.net類與多個構造函數。爲了公開它們,我實現了一個沒有主構造函數的類型。現在我想添加一個靜態字段。我如何初始化靜態字段?試想一下:在F#中,如何初始化沒有主構造函數的類型中的靜態字段?

type MyType = 
    inherit DotNetType 
    [<DefaultValue>] static val mutable private myStatic : int 
    new() = { inherit DotNetType() } 
    new (someArg:string) = { inherit DotNetType(someArg) } 

現在,我怎麼初始化運行恰好一次,如果該類型使用,而不是在所有如果類型是從未使用過的方式「myStatic」場?基本上,我需要一個C#靜態構造函數塊的等價物。

+0

將是解決你的問題:https://msdn.microsoft.com /en-us/library/dd483473.aspx? – MarcinJuraszek

+0

不,這不會因爲我的類型沒有主構造函數。一個「static do」會給我這個錯誤: 「靜態值定義只能用於帶有主構造函數的類型,考慮向類型定義中添加參數,例如'type X(args)= ...'。 感謝您的答覆,但。 –

回答

2

F# spec,部分8.6.3其他對象的類構造:

For classes without a primary constructor, side effects can be performed after the initialization of the fields of the object by using the additional-constr-expr then stmt form.

例子:

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 
+0

但是,每次調用構造函數時都會運行一次邏輯,而不是每次初始化類型時都運行一次。 – kvb

+0

@kvb它爲構造函數的每個調用運行代碼_after_初始化,而來自主構造函數的'static do'語句在啓動時運行,獨立於對構造函數的任何調用。 因此,它們都不能模擬運行_before_第一個實例的[C#靜態構造函數](https://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=vs.140%29.aspx)的行爲創建。 '附加 - 表達式然後stmt'形式允許至少一些控制接近。 – kaefer

相關問題