Почему конструктор по умолчанию класса Program никогда не выполняется?

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

    static void Main(string[] arguments)
    {
      var breakpoint2 = 0;
    }
  }
}
  • Почему breakpoint 1 никогда не попадает, но он всегда нажимает breakpoint 2?
  • И есть ли способ выполнить конструктор по умолчанию перед входом Main()?

Ответы

Ответ 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
}

В качестве альтернативы вы можете сделать конструктор static, хотя, по общему признанию, это не действительно полезный из с точки зрения тестируемости, а также подразумевает, что у вас будут статические переменные (которые доступны по всему миру):

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

Подробнее о статических методах здесь.

Ответ 2

Вы не создаете экземпляр класса. Вы используете метод static Main(). Время выполнения загрузит класс и вызовет метод Main(). Ему не нужен экземпляр класса для вызова метода Main(). Конструктор запускается при создании объекта (объекта).

Ответ 3

Ваш метод статичен: он будет работать без экземпляра существующего класса. Ваш конструктор не работает: он выполняется только при создании экземпляра класса (т.е. При написании new Program()).

Чтобы попасть в точку останова, скорее всего, вы захотите изменить свой конструктор на static Program().

Ответ 4

Точка входа в вашу программу эквивалентна вызову TestApp.Program.Main(args). Класс Program не получает экземпляр.