2011-08-09 6 views
5

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

1st 
2nd 
3rd 

"आधार" कोड मैं का उपयोग करें::

class Myclass 
{   
    static void Main(string[] args) 
    { 
     Console.WriteLine("2nd"); 
    }    
} 

मैं एक स्थिर निर्माता कहा, "1"

class Myclass 
{  
static Myclass() { Console.WriteLine("1st"); } //it will print 1st 
    static void Main(string[] args) 
    { 
     Console.WriteLine("2nd"); // it will print 2nd 
    }    
} 

प्रदर्शित करने के लिए MyClass को

मैं उत्पादन की तरह चाहते हैं अब मुझे Main() संशोधित किए बिना 3 मुद्रित करने के लिए क्या करना है विधि। मैं यह कैसे कर सकता हूं, अगर यह संभव है?

उत्तर

6

स्टेटिक निर्माता के साथ अपने ही सोचा पर जारी रखते हुए, आप AppDomain.ProcessExit घटना का उपयोग कर सकते मुख्य छोड़कर() छेड़छाड़ की।

class Myclass 
    { 
     // will print 1st also sets up Event Handler 
     static Myclass() 
     { 
      Console.WriteLine("1st"); 
      AppDomain.CurrentDomain.ProcessExit += new EventHandler(CurrentDomain_ProcessExit); 
     } 

     static void Main(string[] args) 
     { 
      Console.WriteLine("2nd"); // it will print 2nd 
     } 

     static void CurrentDomain_ProcessExit(object sender, EventArgs e) 
     { 
      Console.WriteLine("3rd"); 
     } 
    } 
+0

सुपरlike धन्यवाद :) – Neo

3

आप सी # में नहीं हो सकते हैं। सी ++ जैसी अन्य भाषाओं में यह स्थिर या वैश्विक वस्तु के विनाशक में ऐसा करना संभव है, लेकिन सी # में अंतिमकर्ता गैर-निर्धारक हैं। यदि प्रक्रिया समाप्त होने से पहले ऑब्जेक्ट कचरा नहीं है तो उन्हें भी बुलाया नहीं जा सकता है।

+0

कैसे ??? हम विनाशक का उपयोग कर सी # में इसका उपयोग क्यों नहीं करते ????? – Neo

+0

क्या हम इसे दो मुख्य() विधि का उपयोग कर कर सकते हैं ???? – Neo

+0

फिर भी, मुख्य विधि स्थैतिक है - कोई ऑब्जेक्ट विनाशक नहीं कहा जाता है। इस प्रकार, यहां कुछ भी काम नहीं करता है- जब कक्षा अपलोड हो जाती है तो कक्षा केवल अनलोड हो जाती है। – TomTom

3

एक प्रोग्राम प्रविष्टि बिंदु के रूप में उपयुक्त एक स्थिर Main के साथ एक और कक्षा जोड़ें। इस कॉल Myclass.Main में:

class MyOtherClass { 
    static void Main(string[] args) { 
    Console.WriteLine("1st"); 
    Myclass.Main(args); 
    Console.WriteLine("3rd"); 
    } 
} 

और फिर निर्माण के लिए विकल्पों MyOtherClass कार्यक्रम प्रवेश बिंदु के रूप में चयन करने के लिए बदल जाते हैं। वीएस में यह परियोजना गुणों में किया जाता है आवेदन | वस्तु शुरू करें। कमांड लाइन के साथ 'csc.exe' /main:typename विकल्प का उपयोग करें।

+0

+1 शायद सबसे अच्छा परिणाम। दिए गए पैरामीटर में तकनीकी रूप से कानूनी - मुख्य विधि को रीडायरेक्ट करना प्रोजेक्ट सेटिंग्स (एंट्री पॉइंट) में एक बदलाव है, मुख्य विधि नहीं, इसलिए यह पैरामीटर के भीतर रहता है। – TomTom

+0

लेकिन इस सीएएन को छोड़कर हम इसे मुख्य() विधि ओवरराइड का उपयोग करके करते हैं ??? – Neo

+0

@ आशीष: कोई केवल वर्चुअल विधियों को ओवरराइड कर सकता है; 'मुख्य 'स्थैतिक है इसलिए वर्चुअल नहीं हो सकता है और इसलिए ओवरराइड नहीं किया जा सकता है। – Richard

5

वहाँ की घटनाओं के एक जोड़े आप के लिए संलग्न कर सकते हैं कर रहे हैं, आवेदन के निकास की घटनाओं को पकड़ने के लिए:

.NET Console Application Exit Event

लेकिन मैं सोच रहा हूँ कि तुम क्या यहाँ हासिल करने की कोशिश कर रहे हैं? क्या आप वाकई अपना मुख्य तरीका नहीं बदल सकते हैं? यदि नहीं, क्यों?

आप किसी अन्य विधि में मुख्य की विधि शरीर को अलग नहीं किया जा सकता है, और इस तरह अपने मुख्य देखो बनाने:

class Myclass 
{  
static Myclass() 
    static void Main(string[] args) 
    { 
     Console.WriteLine("1st"); 
     Process(args); 
     Console.WriteLine("3rd"); 
    } 

    static void Process(string[] args) { 
     Console.WriteLine("2nd"); // it will print 2nd 
    } 
} 
संबंधित मुद्दे