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


Использование конструкторов (руководство по программированию на C#)

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

В следующем примере класс с именем Taxi определяется с помощью простого конструктора. Затем этот класс создается с помощью оператора new. Среда выполнения вызывает конструктор Taxi сразу после выделения памяти для нового объекта.

public class Taxi
{
    private string taxiTag;

    public Taxi(string tag) => taxiTag = tag;

    public override string ToString() => $"Taxi: {taxiTag}";
}

class TestTaxi
{
    static void Main()
    {
        Taxi t = new Taxi("Tag1345");
        Console.WriteLine(t);
    }
}

Конструктор, который не принимает параметров, вызывается конструктор без параметров. Среда выполнения вызывает конструктор без параметров, если объект создается с помощью оператора new, а аргументы не предоставляются для new. В C# 12 появились первичные конструкторы. Основной конструктор задает параметры, которые необходимо предоставить для инициализации нового объекта. Дополнительные сведения см. в конструкторах экземпляров.

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

Вы можете предотвратить создание экземпляра класса, сделав конструктор закрытым, как показано ниже.

class NLog
{
    // Private Constructor:
    private NLog() { }

    public static double e = Math.E;  //2.71828...
}

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

Конструкторы для структур типа напоминают конструкторы классов. При создании экземпляра типа структуры с newсреда выполнения вызывает конструктор. Если для struct задано значение default, среда выполнения инициализирует всю память в структуре до 0. Если вы объявляете любые инициализаторы полей в типе struct, необходимо указать конструктор без параметров. Дополнительные сведения см. в разделе Инициализация структуры и значения по умолчанию статьи типов структуры .

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

int i = new int();
Console.WriteLine(i);

Однако следующий код вызывает ошибку компилятора, так как он не использует new, и потому что он пытается использовать объект, который не инициализирован:

int i;
Console.WriteLine(i);

Кроме того, некоторые struct типы (включая все встроенные числовые типы) можно инициализировать или назначать, а затем использовать в следующем примере:

int a = 44;  // Initialize the value type...
int b;
b = 33;      // Or assign it before using it.
Console.WriteLine("{0}, {1}", a, b);

Классы и структуры могут определять конструкторы, которые принимают параметры, включая первичные конструкторы. Конструкторы, которые принимают параметры, должны вызываться через инструкцию new или базовую инструкцию . Классы и структуры также могут определять несколько конструкторов, и ни те, ни другие не обязаны определять конструктор без параметров. Например:

public class Employee
{
    public int Salary;

    public Employee() { }

    public Employee(int annualSalary) => Salary = annualSalary;

    public Employee(int weeklySalary, int numberOfWeeks) => Salary = weeklySalary * numberOfWeeks;
}

Этот класс можно создать с помощью любой из следующих инструкций:

Employee e1 = new Employee(30000);
Employee e2 = new Employee(500, 52);

Конструктор может использовать ключевое слово base для вызова конструктора базового класса. Например:

public class Manager : Employee
{
    public Manager(int annualSalary)
        : base(annualSalary)
    {
        //Add further instructions here.
    }
}

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

В производном классе, если конструктор базового класса не вызывается явным образом с помощью ключевого слова base, конструктор без параметров, если есть один, вызывается неявно. Следующие объявления конструктора фактически одинаковы:

public Manager(int initialData)
{
    //Add further instructions here.
}
public Manager(int initialData)
    : base()
{
    //Add further instructions here.
}

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

Конструктор может вызвать другой конструктор в том же объекте с помощью ключевого слова this. Как и base, this можно использовать с параметрами или без параметров, а любые параметры в конструкторе доступны в качестве параметров для thisили как часть выражения. Например, второй конструктор в предыдущем примере можно переписать с помощью this:

public Employee(int weeklySalary, int numberOfWeeks)
    : this(weeklySalary * numberOfWeeks)
{
}

Использование ключевого слова this в предыдущем примере приводит к вызову следующего конструктора:

public Employee(int annualSalary) => Salary = annualSalary;

Конструкторы можно пометить как public, private, protected, внутренних, защищенных внутренних или private protected. Эти модификаторы доступа определяют, как пользователи класса могут создавать класс. Дополнительные сведения см. о модификаторах доступа.

Конструктор можно объявить статическим с помощью ключевого слова static. Статические конструкторы вызываются автоматически перед доступом к любым статическим полям и используются для инициализации элементов статического класса. Дополнительные сведения см. в статические конструкторы.

Спецификация языка C#

Дополнительные сведения см. в разделе «Конструкторы экземпляров» и разделе «Статические конструкторы» в спецификации языка C#. Спецификация языка является окончательным источником для синтаксиса И использования C#.

См. также