簡體   English   中英

為什么類Program的默認構造函數從不執行?

[英]Why the default constructor of class Program is Never executed?

namespace TestApp
{
  class Program
  {
    public Program()
    {
      var breakpoint1 = 0;
    }

    static void Main(string[] arguments)
    {
      var breakpoint2 = 0;
    }
  }
}
  1. 為什么breakpoint 1永遠不會被擊中,但它始終擊中breakpoint 2
  2. 有沒有辦法在進入Main()之前執行默認構造函數?

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
}

或者你可以使構造函數變為靜態 ,但是從可測試性的角度來看它確實不是那么有用,並且暗示你將擁有靜態變量(全局可用):

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

您可以在此處閱讀有關靜態方法的更多信

你沒有實例化這個類。 您正在運行static Main()方法。 運行時將加載類並調用Main()方法。它不需要類的實例來調用Main()方法。 構造函數將在構造(實例化)對象時運行。

您的方法是靜態的:它將在沒有現有類的實例的情況下運行。 您的構造函數不是:它只在您創建類的實例時(即,當您編寫new Program() )執行。

為了達到您的斷點,您很可能想要將構造函數更改為static Program()

程序的入口點等同於調用TestApp.Program.Main(args) Program類沒有實例化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM