2011-08-09 55 views
5

我有下面的代碼,我打印的值在使用靜態構造函數調用Main()方法之前的位置。如何在Main()返回後打印另一個值,而不修改Main()方法如何在Main()方法被調用後打印任何值?

我要像輸出:

1st 
2nd 
3rd 

「基地」 的代碼,我用:

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

我添加了一個靜態構造MYCLASS顯示 「1」

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

現在我需要做的是在不修改Main()的情況下打印第3張方法。如果可以的話,我該怎麼做?

回答

6

您與靜態構造函數一樣的想法繼續,您可以使用AppDomain.ProcessExit事件保持Main()不變。

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

超級感謝:) – Neo

3

你不能在C#中。在其他語言(如C++)中,可以在靜態或全局對象的析構函數中執行此操作,但C#中的終結器是非確定性的。如果在過程結束之前對象沒有被垃圾收集,它們甚至可能根本不會被調用。

+0

怎麼樣?爲什麼我們不使用它在C#中使用析構函數????? – Neo

+0

我們可以使用兩個Main()方法嗎? – Neo

+0

即便如此,主要的方法是靜態的 - 沒有調用對象析構函數。因此,這裏什麼都不起作用 - 僅當appdomain卸載時纔會卸載該類。 – TomTom

3

添加適合作爲程序入口點的靜態Main的另一個類。在此調用Myclass.Main

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

,然後改變構建選項選擇MyOtherClass作爲程序的入口點。在VS中,這在項目屬性|中完成應用程序|啓動對象。通過命令行,可以使用/main:typename選項「csc.exe」。

+0

+1可能是最好的結果。在給定的參數中也是技術上合法的 - 重定向主要方法是改變設置(入口點),而不是主要方法本身,所以它保持在要求的參數內。 – TomTom

+0

但除了這個CAn,我們通過使用Override Main()方法來做到這一點? – Neo

+0

@Ashish:只能覆蓋虛擬方法; 'Main'是靜態的,所以不能是虛擬的,因此不能被覆蓋。 – Richard

5

有幾個事件可以附加到,趕應用程序的退出事件:

.NET Console Application Exit Event

但我想知道你正試圖在這裏實現什麼?你確定你不能改變你的Main方法嗎?如果不是,爲什麼?主要的方法體

你能不能劃分爲不同的另一種方法,讓你的主要是這樣的:

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 
    } 
} 
相關問題