2009-11-13 9 views
9

यदि एक स्थिर डेटा सदस्य किसी अन्य स्थिर डेटा सदस्य पर निर्भर करता है, तो क्या सी #/.NET गारंटी है कि निर्भर सदस्य के सदस्य निर्भर सदस्य के समक्ष शुरू हो जाएं?क्या सी # स्थिर डेटा सदस्यों के बीच स्वचालित रूप से निर्भर करता है?

उदाहरण के लिए, हम एक वर्ग की तरह है:

class Foo 
{ 
    public static string a = "abc"; 

    public static string b = Foo.a + "def"; 
} 

जब Foo.b एक्सेस किया जाता है, यह हमेशा "abcdef" या "def" हो सकता है?

यदि इसकी गारंटी नहीं है, तो क्या यह सुनिश्चित करने के लिए कोई बेहतर तरीका है कि निर्भर सदस्य पहले शुरू हुआ?

उत्तर

9

जैसा कि पहले कहा गया था, स्थैतिक क्षेत्र प्रारंभिक निर्धारण निर्धारित है और पाठ्य घोषणा घोषणा के अनुसार चला जाता है।

यह लो, उदाहरण के लिए:

class Foo 
{ 
    public static string b = a + "def"; 
    public static string a = "abc"; 
} 

Foo.b हमेशा "def" का परिणाम देगा।

उस बात के लिए, जब वहाँ स्थिर क्षेत्रों के बीच एक निर्भरता है, यह बेहतर एक स्थिर प्रारंभकर्ता उपयोग करने के लिए है:

class Foo 
{ 
    public static string b; 
    public static string a; 

    static Foo() 
    { 
     a = "abc"; 
     b = a + "def"; 
    } 
} 

इस तरह, आप स्पष्ट रूप से प्रारंभ आदेश के बारे में अपनी चिंता व्यक्त; या उस मामले के लिए निर्भरता (भले ही संकलक गलती से प्रारंभिक विवरणों को स्वैप कर लेते हैं, तो संकलक आपकी सहायता नहीं करेगा।) उपरोक्त में ए और बी (क्रमशः "एबीसी" और "abcdef") में संग्रहीत अपेक्षित मान होंगे।

हालांकि, कई कक्षाओं में परिभाषित स्थैतिक क्षेत्रों की शुरुआत के लिए चीजें मोड़ (और कार्यान्वयन विशिष्ट) हो सकती हैं। भाषा विनिर्देश के अनुभाग 10.4.5.1 Static field initialization इसके बारे में कुछ और बात करते हैं।

2

यह सबवे "abcdef" दिखाएगा, क्योंकि प्रारंभिक स्रोत स्रोत में सबसे नीचे चला गया है, आज पहले जैसा ही है।

सभी स्थैतिक सदस्यों को क्लैस्टस्टेप रखने के बाद उन्हें प्रारंभ किया जाएगा।

+0

जो बदले में इसका मतलब है कि यदि रखरखाव प्रोग्रामर उन दो पंक्तियों को स्वैप करता है, तो बी = ए + "डीफ़" पहले आता है, तो बी को "def" में प्रारंभ किया जाएगा, क्योंकि बी शुरू होने पर शून्य था। अर्थात। ऐसा कुछ करने से, आप घोषणा के आदेश पर निर्भरता लेते हैं। – itowlson

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