2014-04-08 7 views
7

निम्नलिखित वर्ग पर विचार करें:कक्षा के स्थिर सदस्यों पर अजीब व्यवहार - यह कैसे संभव है?

public class MyClass 
{ 
    public static string[] SomeAmazingConsts = { Const1 }; 
    public static string Const1 = "Constant 1"; 
    public static string Const2 = "Constant 2"; 
} 

अब उपयोग की जाँच:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string[] s = MyClass.SomeAmazingConsts; 
     //s[0] == null 
    } 
} 

समस्या यह है कि एस [0] == रिक्त है! यह बिल्ली कैसे होता है? अब, MyClass के स्थिर चर को निम्नानुसार पुन: क्रमबद्ध करें:

public class MyClass 
{ 
    public static string Const1 = "Constant 1"; 
    public static string Const2 = "Constant 2"; 
    public static string[] SomeAmazingConsts = { Const1 }; 
} 

चीजें ठीक से काम करना शुरू कर देती हैं। कोई भी इस पर कुछ प्रकाश डाल सकता है?

+0

आप सरणी के लिए एक अशक्त संदर्भ बताए जाते हैं, यह जादुई साथ फिर से असाइन नहीं मिल सकता है संशोधित मान – jedgard

उत्तर

11
से 10.4.5.1 Static field initialization

स्थिर क्षेत्र एक वर्ग के चर initializers कार्य की एक अनुक्रम कि जो वे कक्षा घोषणा में प्रदर्शित में शाब्दिक क्रम में क्रियान्वित कर रहे हैं के अनुरूप

तो प्रारंभ ऊपर से नीचे होता है, और पहले मामले में Const1 प्रारंभ नहीं किया गया है, इसलिए null

+0

तो क्यों संकलक मुझे "सार्वजनिक स्थैतिक स्ट्रिंग [] कुछ अमेज़िंगकॉन्स्ट = {कॉन्स्ट 1};" पर रोक नहीं देता है लाइन? चूंकि कॉन्स्ट 1 एक स्थैतिक चर है और इसे अभी तक प्रारंभ नहीं किया गया है, इसलिए वे पहले स्थान पर परिभाषित होने से पहले (?) इसे उपयोग करने से रोक सकते हैं। बीटीडब्ल्यू, मैं कैसे सुनिश्चित कर सकता हूं कि पुनर्गठन कोड निष्पादन को प्रभावित नहीं करता है? कोई सलाह? –

+0

मैं रीशेपर का उपयोग करता हूं, और संदेश (केवल यह चेतावनी देता है) राज्य * स्टेटिक फ़ील्ड प्रारंभकर्ता नीचे या अन्य भाग में स्थिर क्षेत्र को संदर्भित करता है *। तो आप बजाय कोड विश्लेषण उपकरण का उपयोग करने पर विचार करना चाहेंगे? साथ ही, आपके चर को सही दायरे में परिभाषित किया गया है, यह उस समय शुरू नहीं हुआ है। –

+0

एक स्पष्ट समाधान स्ट्रिंग सरणी को एक संपत्ति के रूप में घोषित करता है: सार्वजनिक स्थैतिक स्ट्रिंग [] कुछ अमेज़िंगकॉन्स्ट {get {return new string [] {Const1}; }} लेकिन क्या ऐसा करना ठीक है? –

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