2013-06-05 88 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

你沒有實例化這個類。您正在運行一個static Main()方法。運行時將加載類並調用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

感謝您的更正 - 複製和粘貼沒有適當的重視! –

相關問題