2013-07-10 17 views
8

मैं निम्नलिखित एफ # कार्यक्रम है:एफ # मॉड्यूल आरंभीकरण पर अलग-अलग व्यवहार

foo 
bar 
42 

जब मैं बदलने के लिए:

module MyModule 

printfn "foo" 

let test = 
    printfn "bar" 
    42 

यह निम्न उत्पादन का उत्पादन:

open MyModule 

printfn "%d" test 
MyModule किया जा रहा है के साथ

MyModule से:

module MyModule 

printfn "foo" 

let test = 
    // printfn "bar" <-- note the comment! 
    42 

... परिणाम है:

42 

क्यों "foo" अब और मुद्रित नहीं प्राप्त करता है?

उत्तर

17

मुझे लगता है कि स्पेक के अनुभाग 12.5.1, Execution of Static Initializers, आपका उत्तर है। प्रासंगिक बिट का हवाला देते हुए:

फ़ाइल के लिए स्थिर प्रारंभकर्ता नमूदार प्रारंभ है कि एक मूल्य के पहले उपयोग पर निष्पादित किया जाता है

और

सभी परिभाषाओं को छोड़कर नमूदार प्रारंभ है मॉड्यूल में निम्नलिखित परिभाषाएं:

निम्न सूची में निम्न शामिल हैं:

गैर परिवर्तनशील, गैर धागे की स्थानीय मूल्यों है कि एक साधारण निरंतर अभिव्यक्ति

लिए बाध्य कर रहे test की पहली पंक्ति बाहर टिप्पणी के बाद, यह एक निरंतर अभिव्यक्ति बन जाता है। इसलिए, यह अब स्थाई प्रारंभिक ट्रिगर नहीं करता है।

संपादित

कल्पना इस व्यवहार के लिए तर्क प्रदान नहीं करता है, लेकिन यह सी # के लिए इसी तरह की है। उदाहरण के लिए, इस कोड में स्थैतिक प्रारंभिक कभी नहीं होता:

class Program { 
    static void Main(string[] args) { 
     Console.WriteLine(T.Integer); 
     Console.WriteLine(T.Null); 
     Console.WriteLine(T.Enum); 
     Console.Read(); 
    } 
} 

static class T { 
    static T() { 
     Console.WriteLine("You won't see this."); 
    } 
    public const int Integer = 1; 
    public const string Null = null; 
    public const ConsoleKey Enum = ConsoleKey.Escape; 
} 
+0

धन्यवाद, इसे पढ़ने के बाद कुछ बार मैं इसे समझता हूं। हालांकि व्यवहार बहुत जटिल/असंगत लगता है। उदाहरण के लिए "टेस्ट = 1 + 2" "foo" प्रिंट नहीं करता है, जबकि "test = = 1 +" जोड़ने के साथ "test = = + b" प्रिंट करें "foo" प्रिंट करते हैं। यह भाषा की कल्पना के अनुरूप है लेकिन अभी भी अजीब लगता है। क्या कोई कारण है कि स्थिर प्रारंभकर्ताओं को मॉड्यूल के भीतर किसी भी चीज़ पर पहली पहुंच पर निष्पादित नहीं किया जाता है, भले ही यह एक साधारण निरंतर अभिव्यक्ति या कुछ और हो? – stmax

+0

मैंने यह दिखाने के लिए अपना जवाब अपडेट कर दिया है कि सी # समान व्यवहार करता है। मुझे लगता है कि यह एक प्रदर्शन अनुकूलन हो सकता है। चूंकि निरंतर दुष्प्रभावों पर निर्भर होना असंभव है, या उस मामले के लिए कोई गणना नहीं है, इसलिए इसे प्राप्त करने से पहले स्थिर प्रारंभिक होने का कोई स्पष्ट कारण नहीं है। – Daniel

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