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

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

    static void Main(string[] arguments)
    {
      var breakpoint2 = 0;
    }
  }
}
  1. 为什么断点1从来没有被触发,但是断点2总是能够被触发?
  2. 是否有一种方法可以在进入Main()之前执行默认构造函数?

7
你应该了解静态方法和非静态方法的区别。 - Felix K.
4个回答

23

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
}

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


20
你没有实例化这个类,而是在运行一个静态的Main()方法。运行时会加载该类并调用Main()方法。它不需要类的实例去调用Main()方法。构造函数将在构造(实例化)对象时运行。

9

你的方法是静态的:它可以在类实例不存在的情况下运行。你的构造函数不是静态的:只有在创建类的实例时才会执行它(也就是说,当你写 new Program() 时)。

为了达到断点的效果,最可能的情况是你需要将你的构造函数改为 static Program()


静态构造函数不允许使用访问修饰符,即应该写成static Program(){}而不是public static Program(){} - Tim M.
1
虽然没有必要显式地调用静态构造函数,但提到静态构造函数仍然值得一赞。http://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=vs.80).aspx - Mark Brackett
感谢您的纠正 - 没有仔细注意就复制粘贴了! - Dan Puzey

4

你的程序入口相当于调用 TestApp.Program.Main(args)Program 类不会被实例化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接