为什么类Program的默认构造函数从不执行?

Ast*_*arp 14 .net c#

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

    static void Main(string[] arguments)
    {
      var breakpoint2 = 0;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 为什么breakpoint 1永远不会受到打击,但它breakpoint 2总能击中?
  2. 有没有办法在进入之前执行默认构造函数Main()

Spo*_*ike 22

Main方法在没有Program类实例的情况下执行,这是可能的,因为它是静态方法.静态方法是可以调用的方法,无需从类中构造/实例化对象.它们可以直接在类本身上调用,如下所示:

Program.Main(new string[0]); 

// executes the Main static method on Program class 
// with empty string array as argument
Run Code Online (Sandbox Code Playgroud)

构造函数不是静态方法,用于命中实例化Program类所需的断点,如下所示:

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

或者你可以使构造函数变为静态,但是从可测试性的角度来看它确实不是那么有用,并且暗示你将拥有静态变量(全局可用):

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

你可以阅读更多关于静态方法在这里.


NIN*_*OOP 19

你没有实例化这个类.您正在运行一种static Main()方法.运行时将加载类并调用该Main()方法.它不需要类的实例来调用该Main()方法.构造函数将在构造(实例化)对象时运行.


Dan*_*zey 9

您的方法是静态的:它将在没有现有类的实例的情况下运行.您的构造函数不是:它仅在您创建类的实例时(即,在您编写时new Program())执行.

为了达到你的断点,你很可能想要改变你的构造函数 static Program().