2011-08-09 20 views
5

Tôi có mã sau đây mà tôi đang in các giá trị trước khi phương thức Main() được gọi bằng cách sử dụng một hàm tạo tĩnh. Làm thế nào tôi có thể in một giá trị khác sau khi Main() đã trả lại, mà không sửa đổi phương thức Main()?Làm cách nào để in bất kỳ giá trị nào sau khi phương thức Main() được gọi?

Tôi muốn đầu ra như:

1st 
2nd 
3rd 

Các "cơ sở" mã tôi sử dụng:

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

tôi đã thêm một constructor tĩnh để MyClass để hiển thị "1"

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

Bây giờ những gì tôi cần làm là in số 03 mà không sửa đổi số Main() phương pháp. Làm thế nào để làm điều đó, nếu nó là tất cả có thể?

Trả lời

6

Tiếp tục vào suy nghĩ của bạn cùng với các nhà xây dựng tĩnh, bạn có thể sử dụng AppDomain.ProcessExit tổ chức sự kiện rời khỏi Main() bị ảnh hưởng.

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

nhờ siêu cảm ơn :) – Neo

3

Bạn không thể sử dụng C#. Trong các ngôn ngữ khác như C++, có thể làm điều này trong một destructor của một đối tượng tĩnh hoặc toàn cầu, nhưng finalizers trong C# là không xác định. Họ thậm chí có thể không được gọi là ở tất cả nếu đối tượng không phải là rác thu thập được trước khi quá trình kết thúc.

+0

cách ??? tại sao chúng ta không dùng nó trong C# using destructor ????? – Neo

+0

Chúng ta có thể thực hiện nó bằng hai phương thức Main() ???? – Neo

+0

Thậm chí sau đó, phương thức chính là tĩnh - không có đối tượng destructor được gọi. Như vậy, không có gì hoạt động ở đây- lớp này chỉ được nạp khi appdomain unloads. – TomTom

3

Thêm một lớp khác có static Main phù hợp làm điểm nhập chương trình. Trong cuộc gọi này Myclass.Main:

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

và sau đó thay đổi các tùy chọn xây dựng để chọn MyOtherClass như điểm vào chương trình. Trong VS, điều này được thực hiện trong Project Properties | Ứng dụng | Khởi động đối tượng. Với dòng lệnh sử dụng tùy chọn /main:typename để `csc.exe.

+0

+1 Có lẽ là kết quả tốt nhất. Ngoài ra về mặt kỹ thuật hợp pháp trong các tham số được đưa ra - chuyển hướng phương pháp chính là một sự thay đổi trong cài đặt proejct (điểm vào), không phải chính phương thức chính, vì vậy nó vẫn nằm trong các tham số được yêu cầu. – TomTom

+0

Nhưng ngoại trừ CAn này, chúng ta thực hiện bằng cách sử dụng Override phương thức Main() đó ??? – Neo

+0

@Ashish: Người ta chỉ có thể ghi đè các phương thức ảo; 'Main' là tĩnh nên không thể ảo và do đó không thể bị ghi đè. – Richard

5

Có một vài sự kiện mà bạn có thể đính kèm, để nắm bắt những sự kiện Exit của ứng dụng:

.NET Console Application Exit Event

Nhưng tôi tự hỏi những gì bạn đang cố gắng để đạt được đây? Bạn có chắc chắn bạn không thể thay đổi phương pháp chính của mình không? Nếu không, tại sao?

bạn không thể tách ra khỏi cơ thể phương pháp chính vào phương pháp khác, và làm cho cái nhìn chính mình như thế này:

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 
    } 
} 
Các vấn đề liên quan