2011-11-27 3 views
11

निम्नलिखित कोड:स्थैतिक क्षेत्र प्रारंभिक स्थिरता से पहले क्यों होता है?

static void Main(string[] args) 
{ 
    Console.WriteLine("0"); 
    string h = Foo.X; 
    Console.WriteLine("2"); 
} 

public static class Foo 
{ 
    public static string X = ((Func<string, string>)delegate(string g) 
    { 
     Console.WriteLine(g); 
     return (g); 
    })("_aaa"); 

    static Foo() 
    { 
     Console.WriteLine("ctor"); 
    } 
} 

प्रिंट होगा:

0 
_aaa 
ctor 
2 

मैं beforefieldinit व्यवहार (साथ/स्थिर निर्माता आदि के बिना) के बारे में पता है।

बात जो मैं समझ में नहीं कर क्यों ctor (उत्पादन में) _aaa के बाद क्या है?

यह कोई समझ नहीं आता है, अगर मैं निर्माता में चर शुरू करना चाहता हूं तो क्या होगा?

प्रश्न

क्यों X का आरंभीकरण ctor से पहले है करता है?

+0

यह गैर स्थैतिक क्षेत्रों और गैर स्थैतिक रचनाकारों के लिए समान है, निश्चित रूप से: 'कक्षा फू {सार्वजनिक स्ट्रिंग एक्स = "ए"; सार्वजनिक फू() {एक्स = "बी"; }} 'इसके साथ, यदि आप '(नया फू()) करते हैं। एक्स', आपको' बी "', "नहीं" 'मिलता है, क्योंकि' बी "का असाइनमेंट अंतिम होता है (पहले ओवरराइट करें मूल्य)। –

+0

@JeppeStigNielsen स्पष्टीकरण के लिए धन्यवाद –

उत्तर

17

कारण ctor फ़ील्ड प्रारंभकर्ताओं के बाद है क्योंकि यह निर्दिष्ट है। (मेरा जोर है) सी # विनिर्देश से:

10.5.5.1 स्टेटिक क्षेत्र आरंभीकरण स्थिर क्षेत्र एक वर्ग के चर initializers कार्य का एक अनुक्रम कि शाब्दिक क्रम में क्रियान्वित कर रहे हैं, जिसमें वे में प्रदर्शित करने के अनुरूप कक्षा घोषणा। यदि वर्ग में एक स्थिर कन्स्ट्रक्टर (§10.12) मौजूद है, स्थैतिक क्षेत्र प्रारंभकर्ताओं का निष्पादन से पहले उस स्थिर कन्स्ट्रक्टर को निष्पादित करने से पहले होता है। अन्यथा, स्थिर क्षेत्र initializers उस वर्ग के एक स्थिर क्षेत्र का पहली बार उपयोग करने से पहले एक कार्यान्वयन पर निर्भर समय में क्रियान्वित कर रहे हैं

आप अपने आरंभीकरण आदेश के कुल नियंत्रण करना चाहते हैं, यह सब के लिए कदम कन्स्ट्रक्टर के अंदर।

+0

बहुत धन्यवाद ... –