Для чего служат Конструкторы в c#

261
14 сентября 2021, 16:20

Для чего именно служат конструкторы в C# Зачем нужно их создавать? Дайте наглядный пример, пожалуйста. Возможно вопрос глупый, но я не понимаю =)

Answer 1

Конструкторы уже своим названием намекают на свою суть. Нужны они для инициализации объекта. Через них можно передавать какие-то параметры для инициализации:

class A
{
    private int T;
    public A()
    {
        T = 1;
    }
    public A(int t)
    {
        T = t;
    }
    public int Calc(int x) => x * t;
}

В зависимости от выбранного конструктора (передаем параметр или нет, и какой) - меняется поведение объекта. И теперь мы с помощью конструктора гарантируем, что данное поле будет заполнено значением.

Еще он хорошо подходит для инъекций зависимостей. Например так можно реализовать паттерн Стратегия:

class A
{
    private IStrategy _strategy;
    public A()
    {
        // Если берем конструктор без параметров - то создастся стратегия 
        // по-умолчанию
        _strategy = new DefaultStrategy();
    }
    public A(IStrategy strategy)
    {
        //Если в конструктор передать стратегию - то используется она
        _strategy = t;
    }
    public int Calc(int x) => strategy.Perform(x);
}

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

Так же в конструкторе происходят инициализации разных полей класса которые того требуют:

class A
{
    public readonly List<int> FooList;
    public A()
    {
        FooList = new List<int>;
    }
}

И вот вам уже не приходится думать и проверять - создали ли вы список или нет, все будет гарантировано происходить автоматом при создании объекта.

На деле все подходы сочетаются в разных комбинациях. Примерно тем же занимаются порождающие паттерны типа Абстрактных фабрик и Фабричных методов, но там свою нюансы, и фабрики не исключают использования конструкторов, скорее они друг-друга дополняют. Таким образом конструктор заключает в себе некие рутинные мероприятия которые обязаны выполняться всегда при создании объекта. Это позволяет не повторяться, и держать все в одном месте, инкапсулировать внутри класса.

READ ALSO
Почему считывание двумерного массива такое долгое

Почему считывание двумерного массива такое долгое

Пытаюсь считать массив целых чиселЕстественно мне на вход попадают строки и

171
Генерация текстовых файлов с помощью Razor Pages в консольном приложении

Генерация текстовых файлов с помощью Razor Pages в консольном приложении

Столкнулся с такой проблемой, необходимо генерировать текстовые файлы по шаблонуШаблоны часто меняются

173
Удаление записи flask-sqlalchemy

Удаление записи flask-sqlalchemy

Сделал такие модели:

141