[英]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;
}
}
}
breakpoint 1
永遠不會被擊中,但它始終擊中breakpoint 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.