2015-09-06 12 views
7

Birden çok kurucuya sahip bir .net sınıfından türeyen bir F # sınıfım var. Hepsini açığa çıkarmak için, birincil kurucu olmayan bir tür uygularım. Şimdi statik alan eklemek istiyorum. Statik alanı nasıl başlatırım? Şunu bir düşünün:F # içinde, statik alanları birincil kurucu içermeyen bir türde nasıl başlatırım?

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

, nasıl türü kullanılırsa, ve tip hiçbir zaman kullanılmaz hiç eğer tam olarak bir kez çalıştırılan bir şekilde "myStatic" alanını başlatmak do? Esasen bir C# statik yapıcı bloğunun eşdeğerine ihtiyacım var.

+0

misiniz: https://msdn.microsoft.com /en-us/library/dd483473.aspx? – MarcinJuraszek

+0

Hayır, bunun nedeni benim türümün birincil kurucunun olmaması. Statik değer tanımları yalnızca bir birincil kurucuya sahip türlerde kullanılabilir: Tür tanımına argümanlar eklemeyi düşünün, ör. 'X (args) = ...' yazın. Cevabınız için teşekkürler. –

cevap

2

Sınıflar yılında F# spec bölüm 8.6.3 Ek Nesne Yapıcılar bakınız:

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.

Örnek: sorunu çözmek

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

Ancak bu, mantığa, yapının başına bir kez değil, her defasında yapıcıya bir kez basar. – kvb

+0

Kvb Her çağrının yapıcısına _after_ initialization kodunu çalıştırır, oysa primer kuruculardan gelen statik ifadeler, herhangi bir çağrıcının çağrısından bağımsız olarak başlangıçta çalışır. Bu nedenle, [C# statik yapıcı] 'nın (https://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=vs.140%29.aspx) davranışını öykünür; yarattı. 'Ek-constr-expr sonra stmt' formu en azından bazı kontrollerin yaklaşmasına izin verir. – kaefer

İlgili konular