【问题标题】:Why the default constructor of class Program is Never executed?为什么类 Program 的默认构造函数永远不会执行?
【发布时间】:2013-06-05 16:49:02
【问题描述】:
namespace TestApp
{
  class Program
  {
    public Program()
    {
      var breakpoint1 = 0;
    }

    static void Main(string[] arguments)
    {
      var breakpoint2 = 0;
    }
  }
}
  1. 为什么 breakpoint 1 从来没有命中,但它总是命中 breakpoint 2
  2. 还有没有办法在进入Main()之前执行默认构造函数?

【问题讨论】:

  • 你应该阅读静态和非静态方法的区别。

标签: c# .net


【解决方案1】:

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 的更多信息。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 静态构造函数上不允许使用访问修饰符,即它只是static Program(){},而不是public static Program(){}
      • +1 用于提及静态构造函数,尽管不需要 public,因为它是隐式调用的。 msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx
      • 感谢指正 - 复制和粘贴不小心!
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多