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

    static void Main(string[] arguments) 
    { 
     var breakpoint2 = 0; 
    } 
    } 
} 
  1. Tại sao breakpoint 1 không bao giờ đánh, nhưng nó chạm breakpoint 2 luôn?
  2. Và có cách nào để thực thi hàm tạo mặc định trước khi nhập Main() không?
+7

Bạn nên đọc về sự khác biệt của các phương pháp tĩnh và không tĩnh. –

Trả lời

22

Phương thức Main được thực hiện mà không có trường hợp của lớp Program, điều này là có thể vì đây là phương pháp tĩnh. Các phương thức tĩnh là các phương thức có thể được gọi mà không cần phải xây dựng/khởi tạo một đối tượng từ lớp đó. Họ có thể được gọi trực tiếp trên lớp bản thân như thế này:

Program.Main(new string[0]); 

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

Các nhà xây dựng không phải là một phương pháp tĩnh, để đạt breakpoint mà bạn cần phải nhanh chóng lớp Program, như thế này:

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

Ngoài bạn có thể make the constructor static, mặc dù thừa nhận rằng nó không phải là really that useful from a testability standpoint và cũng ngụ ý rằng bạn sẽ có các biến tĩnh (có sẵn trên toàn cầu):

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

Bạn có thể đọc thêm về static methods here.

19

Bạn không khởi tạo lớp học. Bạn đang chạy phương thức static Main(). Thời gian chạy sẽ tải lớp và gọi phương thức Main(). Nó không cần một cá thể của lớp để gọi phương thức Main(). Constructor sẽ chạy khi bạn xây dựng (instantiate) một đối tượng.

4

Điểm vào chương trình của bạn tương đương với gọi TestApp.Program.Main(args). Lớp Program không được khởi tạo.

9

Phương thức của bạn là tĩnh: nó sẽ chạy mà không có cá thể của lớp hiện có. Constructor của bạn không phải là: nó chỉ được thực hiện khi bạn tạo một thể hiện của lớp (nghĩa là, khi bạn viết new Program()).

Để đạt điểm ngắt của bạn, rất có thể bạn muốn thay đổi hàm tạo của mình thành static Program() thay thế.

+0

Các công cụ sửa đổi truy cập không được phép trên các hàm dựng tĩnh, nghĩa là nó chỉ đơn giản là 'static Program() {}', không phải là 'static static Program() {}' –

+1

+1 cho các nhà xây dựng tĩnh, mặc dù không cần công khai vì nó được gọi là ngầm. http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx –

+0

Cảm ơn bạn đã sửa - sao chép và dán mà không cần chú ý! –

Các vấn đề liên quan