2014-07-24 4 views
13

मैं एक सी # व्यवहार में आया हूं जिसे मैं समझना चाहता हूं। इस तरह एक वर्ग पर विचार करें:सी # स्थैतिक क्षेत्र, उदाहरण कन्स्ट्रक्टर

public class SomeSingleton 
{ 
    public static SomeSingleton Default = new SomeSingleton(); 

    private static int field = 0; 

    private SomeSingleton() 
    { 
     field = 1; 
    } 

    public int GetField() 
    { 
     return field; 
    } 
} 

अब, चलो फोन GetField() विधि करते हैं:

var field = SomeSingleton.Default.GetField(); 

मैं 0 हो रही है के रूप में अगर उदाहरण के निर्माता को छोड़ दिया गया था। क्यूं कर?

उत्तर

26

Default से पहले field घोषणा के आदेश को स्वैप करें।

तो अपने लाइनों:

public static SomeSingleton Default = new SomeSingleton(); 
private static int field = 0; 

होना चाहिए:

private static int field = 0; 
public static SomeSingleton Default = new SomeSingleton(); 

कारण क्षेत्र आरंभीकरण आदेश के कारण है। पहले Default आपके कोड में प्रारंभ किया गया है, जो field1 का मान निर्दिष्ट करता है। बाद में उस क्षेत्र को प्रारंभ में 0 असाइन किया गया है। इसलिए आप 0 का नवीनतम मान देखते हैं और 1 नहीं देखते हैं।

देखें: एक वर्ग के 10.4.5.1 Static field initialization

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

+1

बेहतर अभी तक, 'फ़ील्ड' के लिए प्रारंभकर्ता को पूरी तरह से लें। जब ऑब्जेक्ट पहली बार बनाया जाता है (स्थिर फ़ील्ड के लिए, जब टाइप पहली बार लोड होता है) सभी फ़ील्ड शून्य (या 'null') पर प्रीसेट होते हैं। –

3

स्थैतिक चर के क्रम को स्विच करें।

private static int field = 0; 
public static SomeSingleton Default = new SomeSingleton(); 

अपने कोड में, निर्माता पहले से चलाता है, जो सेट field, और फिर field अपने मूल्य ओवरराइड करता है।

7

ऐसा इसलिए है क्योंकि static चर के क्रम। यदि आप दो कथन जाते हैं तो उत्पादन 1 हो जाता है:

private static int field = 0; 

public static SomeSingleton Default = new SomeSingleton(); 

यह व्यवहार की उम्मीद है के रूप में MSDN: Static field initialization में प्रलेखित।

this .NET Fiddle देखें।

+4

+1 .NET Fiddle, शानदार टूल के लिंक के लिए धन्यवाद। –

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