2010-08-26 9 views
6

अपेक्षित उत्पादन & उत्पादन मैं डिबग मोड में मिलता है, और VS2010 के तहत जारी मोड, .NET 4.0:स्टेटिक सदस्य चर रिलीज में शुरू नहीं किया जा रहा है - कंपाइलर/क्लियर बग?

bar construct 
main 

रिलीज़ मोड में आउटपुट नहीं VS2010 डिबगर के तहत, और WinDbg के तहत:

main 

कार्यक्रम VS2005 पर इस व्यवहार, नेट 2,0

using System; 

namespace static_init 
{ 
    public class bar 
    { 
     public bar() 
     { 
      Console.WriteLine("bar construct"); 
     } 
    } 

    class Program 
    { 
     public static bar blah = new bar(); 

     static void Main(string[] args) 
     { 
      Console.WriteLine("main"); 
      Console.ReadLine(); 
     } 
    } 
} 
का प्रदर्शन नहीं करता

शायद संबंधित: Static constructor can run after the non-static constructor. Is this a compiler bug?

अद्यतन

अपने वास्तविक कोड निर्माता bar() में सी ++ (अप्रबंधित) के साथ कुछ इंटरॉप कोड initializes। इस पुस्तकालय में किसी और चीज से पहले ऐसा होने की ज़रूरत है - क्या यह सुनिश्चित करने का कोई तरीका है कि init() फ़ंक्शन जो सभी स्थिरताओं को स्पर्श करता है (साइड इफेक्ट्स जिन्हें बाहरी रूप से संदर्भित नहीं किया जाता है) लाइब्रेरी में?

भावी खोजकर्ताओं के लिए नोट: मैं SWIG का उपयोग कर रहा हूं, और यह एक धारणा है कि उन्होंने अपने रैपर पीढ़ी कोड में बनाया है। SWIGStringHelper वर्तमान अपराधी है, हालांकि और भी हो सकता है।

निष्कर्ष

बड़ा घूँट के संस्करण 2.0 के लिए अद्यतन, यह के रूप में नेट के नए संस्करण की जरूरत स्थिर निर्माता में डालता है।

+0

धन्यवाद 'अपडेट' और 'निष्कर्ष' के लिए बहुत बहुत धन्यवाद - मेरे पास बहुत ही समान परिदृश्य है और पुराने SWIG 1.3.40 का भी उपयोग किया गया - बस 2.0.9 पर अपडेट किया गया और सभी ठीक काम करता है। "निष्कर्ष" मुझे जांच के लिए बहुत समय बचाता है! – sergtk

उत्तर

10

शायद यह अनुकूलित हो रहा है क्योंकि आप इसका उपयोग नहीं करते हैं।

यह एक कंपाइलर बग भी नहीं है, यह भाषा की कल्पना में है।

17.4.5.1 स्टेटिक क्षेत्र आरंभीकरण

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

जब से तुम कार्यक्रम वर्ग के एक स्थिर क्षेत्र का उपयोग कभी नहीं की एक स्थिर क्षेत्र का पहली बार उपयोग करने से पहले, स्थैतिक प्रारंभकर्ता को चलाने की गारंटी नहीं है (हालांकि यह ...'कार्यान्वयन पर निर्भर समय' से ऊपर)

अद्यतन
आप पूरा कर सकते हैं कार्यक्रम बनाकर आप क्या चाहते हैं एक स्थिर निर्माता है।

static Program(){} या संभवतः एक और (संभवतः डमी) स्थिर चर तक पहुँचने

6

ध्यान दें कि वहाँ स्थिर आरंभीकरण के बारे में .NET 4.0 में कुछ बदलाव किया गया है द्वारा। जॉन स्कीट कुछ नमूने के साथ एक ब्लॉग पोस्ट में लिखा है:

Type initialization changes in .NET 4.0

आप सटीक प्रारंभ चाहते हैं, आप एक स्थिर निर्माता (खाली हो सकता है) का उपयोग करना चाहिए।

using System; 

namespace static_init 
{ 
    public class bar 
    { 
     public bar() 
     { 
      Console.WriteLine("bar construct"); 
     } 
    } 

    class Program 
    { 
     public static bar blah = new bar(); 

     // This static constructor will make sure that the type Program 
     // is initialized before it is first used. 
     // 
     static Program() 
     { } 

     static void Main(string[] args) 
     { 
      Console.WriteLine("main"); 
      Console.ReadLine(); 
     } 
    } 
} 
संबंधित मुद्दे