Конструкторы (руководство по программированию на C#)

Всякий раз, когда создается экземпляр класса или структуры , его конструктор вызывается. Класс или структура может иметь несколько конструкторов, принимающих различные аргументы. Конструкторы позволяют программисту задавать значения по умолчанию, ограничивать число установок и писать код, который является гибким и удобным для чтения. Дополнительные сведения и примеры см. в разделах Конструкторы экземпляров и Использование конструкторов.

Существует несколько действий, которые являются частью инициализации нового экземпляра. Эти действия выполняются в следующем порядке:

  1. Для полей экземпляра задано значение 0. Обычно это делается средой выполнения.
  2. Запускаются инициализаторы полей. Инициализаторы полей в большинстве производных типов выполняются.
  3. Запускаются инициализаторы полей базового типа. Инициализаторы полей начинаются с прямой базы с каждым базовым типом System.Object.
  4. Запускаются конструкторы базовых экземпляров. Все конструкторы экземпляров, начиная с Object.Object каждого базового класса, до прямого базового класса.
  5. Выполняется конструктор экземпляра. Конструктор экземпляра для выполнения типа.
  6. Запускаются инициализаторы объектов. Если выражение включает в себя инициализаторы объектов, они выполняются после запуска конструктора экземпляра. Инициализаторы объектов выполняются в текстовом порядке.

Предыдущие действия выполняются при инициализации нового экземпляра. Если для нового экземпляра задано значение, default все поля экземпляра struct имеют значение 0.

Если статический конструктор не выполняется, статический конструктор выполняется до того, как будут выполняться какие-либо действия конструктора экземпляра.

Синтаксис конструктора

Конструктор — это метод, имя которого совпадает с именем его типа. Его сигнатура метода включает только дополнительный модификатор доступа, имя метода и его список параметров; он не включает возвращаемый тип. В приведенном ниже примере демонстрируется конструктор для класса с именем Person.

public class Person
{
   private string last;
   private string first;

   public Person(string lastName, string firstName)
   {
      last = lastName;
      first = firstName;
   }

   // Remaining implementation of Person class.
}

Если конструктор поддерживает реализацию в виде оператора, можно использовать определение тела выражения. В следующем примере определяется класс Location, конструктор которого имеет один строковый параметр name. Определение тела выражения присваивает аргумент полю locationName.

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

Статические конструкторы

В приведенных выше примерах показаны конструкторы экземпляров, которые создают новый объект. В классе или структуре также может быть статический конструктор, который инициализирует статические члены типа. Статические конструкторы не имеют параметров. Если вы не предоставили статический конструктор для инициализации статических полей, компилятор C# инициализирует статические поля значениями по умолчанию, как показано в статье Значения по умолчанию типов C#.

В следующем примере статический конструктор используется для инициализации статического поля.

public class Adult : Person
{
   private static int minimumAge;

   public Adult(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Adult()
   {
      minimumAge = 18;
   }

   // Remaining implementation of Adult class.
}

Можно также определить статический конструктор с помощью определения тела выражения, как показано в следующем примере.

public class Child : Person
{
   private static int maximumAge;

   public Child(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Child() => maximumAge = 18;

   // Remaining implementation of Child class.
}

Дополнительные сведения и примеры см. в разделе Статические конструкторы.

В этом разделе

См. также