2010-11-10 18 views
14

प्रिय सभी, इस तरह का सवाल already asked रहा है, लेकिन उत्तरों में से जो समस्या मैं देखता हूं उसका कोई स्पष्टीकरण नहीं था।स्टेटिक कन्स्ट्रक्टर उदाहरण के बाद कन्स्ट्रक्टर कहा जाता है?

समस्या: C# Programming Guide का कहना है:

एक स्थिर निर्माता किसी भी स्थिर डेटा प्रारंभ करने, या किसी ख़ास कार्य है कि एक बार ही किया जाता जरूरत प्रदर्शन करने के लिए प्रयोग किया जाता है। इसे पहले उदाहरण के निर्माण से पहले स्वचालित रूप से कहा जाता है या किसी स्थिर सदस्यों का संदर्भ दिया जाता है।

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

के उदाहरण कोड पर विचार करें:

using System; 

public class Test 
{ 
    static public Test test = new Test(); 
    static Test() 
    { 
     Console.WriteLine("static Test()"); 
    } 
    public Test() 
    { 
     Console.WriteLine("new Test()"); 
    } 
} 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Main() started"); 
     Console.WriteLine("Test.test = " + Test.test); 
     Console.WriteLine("Main() finished"); 
    } 
} 

यह आउटपुट:

मुख्य() शुरू कर दिया
नया टेस्ट()
स्थिर टेस्ट()
Test.test = टेस्ट
मुख्य() समाप्त

तो हम से पहले स्थिर निर्माता शुरू होता देख सकते हैं कि उदाहरण के निर्माता खत्म (और इस प्रकार एक उदाहरण बन जाता है) । क्या यह गाइड का विरोध नहीं करता है? हो सकता है कि स्थैतिक क्षेत्रों की शुरुआत स्थिर कन्स्ट्रक्टर का एक निहित हिस्सा माना जाता है?

+1

आप वास्तव में कक्षा के बाहर इसे स्थिर संपत्ति के उदाहरण को आवंटित क्यों नहीं करते हैं, फिर ऑर्डर जांचें? यह मुझे परीक्षण करने के लिए एक भयानक तरीका की तरह दिखता है। – mway

+0

ऐसा नहीं है क्योंकि आप 'स्थिर' सदस्य को तत्काल कर रहे हैं ...? – rsenna

+0

@mway: यह अन्य तरीकों से काम कर सकता है, लेकिन मैं समझना चाहता हूं कि इस मामले में क्या होता है। – Vlad

उत्तर

23

static फ़ील्ड के लिए इनलाइन प्रारंभकर्ता स्पष्ट static कन्स्ट्रक्टर से पहले चलाते हैं।

संकलक कुछ इस तरह में अपने वर्ग बदल देती है:

public class Test { 
    .cctor { //Class constructor 
     Test.test = new Test();    //Inline field initializer 
     Console.WriteLine("static Test()"); //Explicit static ctor 
    } 
    .ctor { ... } //Instance constructor 
} 

ध्यान दें कि यह घोषणा क्रम से स्वतंत्र है।

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

spec के शब्दों में। एक स्थिर निर्माता (Section 10.11) में वर्ग मौजूद है, तो स्थिर क्षेत्र initializers के निष्पादन होता है तुरंत कि स्थिर निर्माता को क्रियान्वित करने से पहले।

+1

हां, यह http://msdn.microsoft.com/en-us/library/79b3xss3.aspx द्वारा गारंटीकृत है: "स्थैतिक सदस्यों को पहली बार स्थिर सदस्य का उपयोग करने से पहले और स्थिर कन्स्ट्रक्टर से पहले, प्रारंभिक सदस्यों को प्रारंभ किया जाता है, यदि वहां एक है, कहा जाता है। " लेकिन क्या यह सवाल से पहले उद्धरण का खंडन नहीं करता है? – Vlad

+1

+1 हाँ आपने इसे खींचा। – rsenna

+0

@Vlad: यदि स्थैतिक सीटीआर कक्षा को तुरंत चालू करता है, तो यह तब तक समाप्त नहीं होगा जब तक यह कक्षा को तुरंत चालू नहीं करता है। – SLaks

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