2013-06-05 4 views
14
namespace TestApp 
{ 
    class Program 
    { 
    public Program() 
    { 
     var breakpoint1 = 0; 
    } 

    static void Main(string[] arguments) 
    { 
     var breakpoint2 = 0; 
    } 
    } 
} 
  1. क्यों breakpoint 1 मारा कभी नहीं है, लेकिन यह breakpoint 2 हमेशा हिट?
  2. और Main() दर्ज करने से पहले डिफ़ॉल्ट कन्स्ट्रक्टर निष्पादित करने का कोई तरीका है?
+7

आप स्थिर और गैर स्थिर तरीकों में से अंतर के बारे में पढ़ना चाहिए। –

उत्तर

22

Main विधि Program कक्षा के उदाहरण के बिना निष्पादित की जाती है, जो संभव है क्योंकि यह एक स्थिर विधि है। स्टेटिक विधियां वे विधियां हैं जिन्हें कक्षा से ऑब्जेक्ट को बनाने/तत्काल करने की आवश्यकता के बिना बुलाया जा सकता है। वे सीधे कक्षा पर ही बुलाया जा सकता है इस तरह:

Program.Main(new string[0]); 

// executes the Main static method on Program class 
// with empty string array as argument 

निर्माता एक स्थिर तरीका नहीं है, कि ब्रेकप्वाइंट हिट करने के लिए आप, Program वर्ग का दृष्टांत करने की जरूरत है इस तरह:

static void Main(string[] arguments) 
{ 
    var breakpoint2 = 0; 
    new Program(); // breakpoint1 will be hit 
} 

वैकल्पिक रूप से आप make the constructor static कर सकते हैं, हालांकि वैसे यह really that useful from a testability standpoint नहीं है और यह भी संकेत मिलता है कि आप स्थैतिक चर (जो विश्व स्तर पर उपलब्ध हैं) करने जा रहे हैं:

static Program() { 
    var breakpoint1 = 0; 
    // breakpoint will be hit without an instance of the Program class 
} 

आप static methods here के बारे में अधिक पढ़ सकते हैं।

19

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

4

आपके कार्यक्रम का प्रवेश बिंदु TestApp.Program.Main(args) पर कॉल करने के बराबर है। Program कक्षा तत्काल नहीं मिलती है।

9

आपकी विधि स्थिर है: यह मौजूदा कक्षा के उदाहरण के बिना चलाएगी। आपका कन्स्ट्रक्टर नहीं है: यह केवल तभी निष्पादित होता है जब आप कक्षा का उदाहरण बनाते हैं (यानी, जब आप new Program() लिखते हैं)।

के लिए अपने ब्रेकप्वाइंट हिट करने के लिए, सबसे अधिक संभावना है कि आप अपने निर्माता को बदलने के लिए बजाय static Program() होना चाहता हूँ।

+0

पहुँच संशोधक स्थिर कंस्ट्रक्टर्स पर अनुमति नहीं है, यानी यह होगा बस 'स्थिर कार्यक्रम() {}', नहीं 'जनता स्थिर कार्यक्रम() {}' –

+1

+1 स्थिर कंस्ट्रक्टर्स का उल्लेख के लिए, जनता के लिए कोई आवश्यकता नहीं है, हालांकि के बाद से यह परोक्ष कहा जाता है। http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx –

+0

सुधार के लिए धन्यवाद - कॉपी करने और चिपकाने वजह से ध्यान के बिना! –

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

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