2010-07-01 8 views
5

यदि हमारे पास हमारे प्रोजेक्ट में एक और स्थिर वर्ग हैं तो कौन सा स्थैतिक वर्ग पहले शुरू होता है?कौन सा स्थैतिक वर्ग पहले शुरू करता है?

उदाहरण के लिए: कोड के नीचे शून्य अपवाद देता है।

class Program 
    { 
     static void Main(string[] args) 
     { 
      First.Write(); 
      Second.Write(); 
     } 
    } 
    static class First 
    { 
     public static int[] firstArray = new int[20]; 
     public static int[] secondArray = Second.secondArray; 
     public static void Write() 
     { 
      Console.WriteLine(firstArray.ToString()); 
      Console.WriteLine(secondArray.ToString()); 
     } 
    } 
    static class Second 
    { 
     public static int[] firstArray = First.firstArray; 
     public static int[] secondArray = new int[30]; 
     public static void Write() 
     { 
      Console.WriteLine(firstArray.ToString()); 
      Console.WriteLine(secondArray.ToString()); 
     } 
    } 

आप ध्यान देना है, तो आप यह है कि अगर First वर्ग में ही प्रारंभ हो जाएगा तो Second की secondArray फ़ील्ड रिक्त हो जाएगा देखेंगे। लेकिन अगर Second कक्षा पहले शुरू होगी तो Second कक्षा firstArray शून्य होगी। मैं यह बताने की कोशिश कर रहा हूं कि पहले शुरूआत करने से अलग-अलग परिणाम मिलते हैं।

मुझे लगता है कि यह मेरे प्रोजेक्ट के बारे में अमूर्त प्रश्न है। मुझे यह समझने की कोशिश करते हुए इसका सामना करना पड़ रहा है कि मुझे अप्रत्याशित परिणाम क्यों मिल रहे हैं।

उत्तर

10

First प्रारंभ करने, firstArray दें और इसके बाद नोटिस कि यह Second की आवश्यकता है क्रम secondArray का प्रारंभिक मूल्य प्राप्त करने के लिए प्रारंभ करने के लिए शुरू हो जाएगा।

Second प्रारंभ करना शुरू कर देगा, और फिर ध्यान दें कि इसे प्रारंभ करने के लिए पहले की आवश्यकता है। हालांकि, सीएलआर तब ध्यान देगा कि वर्तमान धागे में शुरुआती पहले से ही है, इसलिए यह अवरुद्ध नहीं होगा। Second का प्रारंभिक कार्य पूरा हो जाएगा, और फिर प्रथम का प्रारंभिक कार्य पूरा हो जाएगा।

सौभाग्य से, Second फ़ील्ड को पहले ही असाइन किया गया है, इसलिए "सही चीज़" होती है।

यह बहुत अच्छा है अगर Firstवास्तव में पहले आरंभ करना शुरू करता है। हालांकि, चूंकि कक्षाओं में से कोई भी स्थिर कन्स्ट्रक्टर नहीं है, इसलिए यह संभव है कि Second पहले आरंभ करना शुरू कर देगा ... फिर यह First को प्रारंभ करना शुरू कर देगा, जो यह बताएगा कि Second पहले ही प्रारंभ हो रहा है और Second.secondArray का वर्तमान मान (शून्य) First.secondArray के लिए। यह एक बुरी चीज होगी। ध्यान दें कि स्थिर रचनाकारों के बिना प्रकार के प्रारंभिक समय changed in .NET 4 है - एक spec तोड़ने के तरीके में नहीं, लेकिन संभवतः मौजूदा कोड-ब्रेकिंग तरीके से।

यदि दोनों First और Second स्थिर कंस्ट्रक्टर्स था, तो First पहले प्रारंभ किया जाएगा, के रूप में है कि प्रथम श्रेणी है कि Main छूता है।

उत्तर का नैतिक: ऐसा मत करो। प्रारंभिक टाइप करें जो एक-दूसरे को संदर्भित करते हैं, बहुत ही त्रुटि प्रवण होते हैं। एक और उदाहरण के लिए, एरिक लिपर्ट और नील गफ्फर्स की एनडीसी 2010 टॉक, "सी # पज़लर" देखें, जिसे NDC video page पर देखा जा सकता है।

+0

मानक गारंटी करता है यह आदेश? मेरा अनुमान था कि प्रत्येक वर्ग पहली पहुंच से पहले कुछ अपरिभाषित पर शुरू होता है, जो इसे एक निर्भरता चक्र में बदल देता है जो यादृच्छिक रूप से हल हो जाता है। –

+0

@ टिम: मैंने अपना जवाब अपडेट कर लिया है - बिना स्थिर रचनाकारों के, आदेश वास्तव में अपरिभाषित है। –

+0

वीएस2005 से जुड़ा डीबगर के साथ, एक बुरी चीज होती है - 'दूसरा। फर्स्टअरे' को 'शून्य' – AakashM

0

मुझे विश्वास नहीं है कि इस बात की कोई गारंटी है कि किस स्थिर प्रकार को पहले शुरू किया गया है। यह सुनिश्चित करने के क्षेत्रों ठीक से इस तरह initialised कर रहे हैं, आप एक स्थिर निर्माता, जैसे जोड़ने की जरूरत चाहते हैं:

static class Second 
{ 
    public static int[] firstArray = First.firstArray; 
    public static int[] secondArray = new int[30]; 

    static Second() { } 

    public static void Write() 
    { 
     Console.WriteLine(firstArray.ToString()); 
     Console.WriteLine(secondArray.ToString()); 
    } 
} 

अब, जब आप फिर से एक ही बात चलाने के लिए, यह काम करता है ...

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