15
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

4 回答 4

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
}

或者,您可以将构造函数设为 static,尽管从可测试性的角度来看,它确实不是很有用,并且还意味着您将拥有静态变量(全局可用):

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

您可以在此处阅读有关静态方法的更多信息。

于 2013-06-05T16:57:52.857 回答
20

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

于 2013-06-05T16:51:12.750 回答
9

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

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

于 2013-06-05T16:53:02.880 回答
4

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

于 2013-06-05T16:52:16.650 回答