2015-09-06 15 views
7

मेरे पास एक एफ # वर्ग है जो कई रचनाकारों के साथ एक .net वर्ग से निकला है। उन सभी को बेनकाब करने के लिए, मैं एक प्रकार का प्राथमिक कन्स्ट्रक्टर के साथ लागू करता हूं। अब मैं एक स्थिर क्षेत्र जोड़ना चाहता हूं। मैं स्थैतिक क्षेत्र कैसे शुरू करूं? इस पर विचार करें:एफ # में, मैं किसी भी प्रकार के प्राथमिक कन्स्ट्रक्टर वाले स्थिर फ़ील्ड को कैसे प्रारंभ करूं?

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

अब, मैं कैसे एक तरीका है कि ठीक एक बार चलता है, तो प्रकार प्रयोग किया जाता है, और बिल्कुल नहीं करता है, तो प्रकार इस्तेमाल कभी नहीं किया है में "myStatic" क्षेत्र को प्रारंभ करते हैं? अनिवार्य रूप से, मुझे सी # स्थिर कन्स्ट्रक्टर ब्लॉक के बराबर की आवश्यकता है।

+0

चाहेंगे कि आपकी समस्या का समाधान: https://msdn.microsoft.com /en-us/library/dd483473.aspx? – MarcinJuraszek

+0

नहीं, ऐसा नहीं होगा क्योंकि मेरे प्रकार में प्राथमिक निर्माता नहीं है। एक "स्थैतिक डू" मुझे यह त्रुटि प्राप्त करता है: "स्टेटिक वैल्यू डेफिनिशन केवल प्राथमिक कन्स्ट्रक्टर वाले प्रकारों में उपयोग किया जा सकता है। टाइप परिभाषा में तर्क जोड़ने पर विचार करें, उदाहरण के लिए 'टाइप एक्स (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_ प्रारंभिकता चलाता है, जबकि स्टार्टअप पर चलने वाले प्राथमिक रचनाकारों से 'स्थैतिक डू' कथन, किसी कन्स्ट्रक्टर को किसी भी कॉल से स्वतंत्र होता है। इसलिए, न तो [सी # स्थिर कन्स्ट्रक्टर] (https://msdn.microsoft.com/en-us/library/k9x6w0hc%28v=vs.140%29.aspx) के व्यवहार को अनुकरण करता है जो पहले उदाहरण है _before_ चलाता है बनाया था। 'अतिरिक्त-constr-expr तब stmt' रूप कम से कम कुछ नियंत्रण बंद करने की अनुमति देता है। – kaefer

संबंधित मुद्दे