为什么类Program的默认构造函数从不执行?
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
类没有实例化。