Поделиться через


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

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

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

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

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

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

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

Конструктор — это метод с тем же именем, что и его тип. Его сигнатура метода может включать необязательный модификатор доступа, имя метода и список параметров; Он не включает тип возвращаемого значения. В следующем примере показан конструктор для класса с именем 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, конструктор которого имеет один строковый параметр с именем . Определение тела выражения присваивает аргумент полю locationName.

public class Location
{
   private string locationName;

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

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

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

public class LabelledContainer<T>(string label)
{
   public string Label { get; } = label;
   public required T Contents 
   { 
      get;
      init;
   }
}

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

В предыдущих примерах показаны конструкторы экземпляров, которые инициализируют новый объект. Класс или структуру также может объявлять статический конструктор, который инициализирует статические члены типа. Статические конструкторы не имеют параметров. Если вы не предоставляете статический конструктор для инициализации статических полей, компилятор 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.
}

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

См. также