С# Зачем в таких ситуациях рекомендуют вызывать конструктор базового типа?


#1

Почему при создании экземпляра производного класса, который в своём конструкторе использует поля базового типа рекомендуют их инициализацию проводить через вызов конструктора базового типа, как в этом примере:

class Base
{
     protected int field;

     public Base(int field)
     {
            this.field = field;
     }
}

class Derived : Base
{
     int field2;

     public Derived (int field, int field2)
                : base(field)
     {
            this.field2 = field2;
     }
}

#2

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

class Base
{
    protected int field;

    public Base()
    {
            
    }

    public Base(int field)
    {
        this.field = field;
    }
}

class Derived : Base
{
    int field2;

    public Derived(int field, int field2)
    {
        this.field2 = field2;
        base.field = field;
    }
}

В таком случае при создании экземпляра Derived класса сперва произойдёт вызов конструктора по умолчанию Base класса (полю field будет присвоено значение по умолчанию для его типа, то есть 0), после чего будет вызван конструктор Derived класса (а котором полю field будет присвоено переданное в конструктор значение). С этого следует, что полю field дважды присваивалось значение.

Таким образом конструктор в Derived классе можно записать также вот так:

    public Derived(int field, int field2)
                    : base()
    {
        this.field2 = field2;
        base.field = field;
    }

Приведённый Вами код позволяет избежать присвоению значения по умолчанию field и сразу присвоить необходимое значение, тем самым уменьшив количество операций на 1. Конечно может показаться, что это того не стоит, но кто говорит, что в базовый конструктор нужно передавать только одно значение, да и чем больше экземпляров данного класса создаётся, тем больше количество инструкций было "пропущено".