← Все вопросы

Как работают конструкторы в C# и можно ли их перегружать?

Задан 4 месяца назад813 просмотров2 ответа
8

Не до конца понимаю конструкторы. Это метод без типа возврата с именем класса? Можно ли сделать несколько конструкторов и как вызвать один из другого?

class User
{
    public string Name;
    public User(string name) { Name = name; }
}

2 ответа

15
✓ Принятый ответ — помог автору

Да, конструктор — это специальный метод, который вызывается при создании объекта через new. У него имя совпадает с классом и нет типа возврата. Его задача — привести объект в корректное начальное состояние.

Можно объявить несколько конструкторов (перегрузка) с разным набором параметров:

class User
{
    public string Name;
    public int Age;

    public User(string name)
    {
        Name = name;
        Age = 18; // значение по умолчанию
    }

    public User(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

var u1 = new User("Аня");
var u2 = new User("Борис", 30);

Чтобы не дублировать код, один конструктор можно вызвать из другого через : this(...):

class User
{
    public string Name;
    public int Age;

    public User(string name) : this(name, 18) { }

    public User(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

Если не написать ни одного конструктора, компилятор создаст пустой конструктор по умолчанию. Но как только вы объявили хотя бы один свой, бесплатный конструктор без параметров исчезает — его придётся добавить вручную, если он нужен.

5

Дополню про вызов конструктора базового класса через : base(...) при наследовании:

class Person
{
    public string Name;
    public Person(string name) { Name = name; }
}

class Employee : Person
{
    public decimal Salary;
    public Employee(string name, decimal salary) : base(name)
    {
        Salary = salary;
    }
}

Здесь base(name) сначала вызывает конструктор Person, а потом выполняется тело конструктора Employee. Это обязательно, если у базового класса нет конструктора без параметров.

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект