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

时间:2013-06-05 16:49:03

标签: c# .net

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

    static void Main(string[] arguments)
    {
      var breakpoint2 = 0;
    }
  }
}
  1. 为什么 breakpoint 1 永远不会被点击,但总是会点击 breakpoint 2
  2. 有没有办法在输入Main()之前执行默认构造函数?

4 个答案:

答案 0 :(得分: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的更多信息。

答案 1 :(得分:19)

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

答案 2 :(得分:9)

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

为了达到您的断点,您很可能希望将构造函数更改为 static Program()

答案 3 :(得分:4)

程序的入口点相当于调用TestApp.Program.Main(args)。 <{1}}类没有实例化。