Подтвердить что ты не робот

Порядок вызова конструкторов случай наследования в С#

Я просто читал Inheritance в С#, в котором я столкнулся с конструкторами, и было написано, что конструкторы выполняются в порядке вывода. Что это значит? Конструктор базового класса будет вызываться первым или Производный класс.

4b9b3361

Ответ 1

Сначала формируется конструктор базового класса. Обратитесь к следующему примеру

// Demonstrate when constructors are called.
using System;

// Create a base class.
class A {
    public A() {
        Console.WriteLine("Constructing A.");
    }
}

// Create a class derived from A.
class B : A {
    public B() {
        Console.WriteLine("Constructing B.");
    }
}

// Create a class derived from B.
class C : B {
    public C() {
        Console.WriteLine("Constructing C.");
    }
}

class OrderOfConstruction {
    static void Main() {
        C c = new C();
    }
}

The output from this program is shown here:

Constructing A.
Constructing B.
Constructing C.

Ответ 2

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DerivationTest
{
    class Program
    {
        public class Thing
        {
            public Thing()
            {
                Console.WriteLine("Thing");
            }
        }

        public class ThingChild : Thing
        {
            public ThingChild()
            {
                Console.WriteLine("ThingChild");
            }
        }

        static void Main(string[] args)
        {
            var tc = new ThingChild();
            Console.ReadLine();
        }
    }
}

Ответ 3

Конструкторы классов вызываются в порядке, предполагаемом деривацией, но важно отметить, что в С# инициализаторы полей (например, int foo=5) выполняются перед конструктором базового класса и, таким образом, выполняются в обратном порядке. Это в первую очередь полезно, если базовый конструктор может вызвать виртуальную функцию, которая переопределяется в производном классе для вызова до завершения базового конструктора. Такая функция увидит любые инициализируемые инициализаторами поля переменные, которые были инициализированы.

VB.net, кстати, запускает все инициализаторы полей после завершения конструктора базового класса, но прежде всего в конструкторе производного класса (отличном от цепочки к базовому конструктору). Это означает, что виртуальные методы должны знать, что инициализаторы полей могут не выполняться, но также означает, что инициализаторы полей могут использовать объект под конструкциями (которые они не могут выполнять в С#).

Кстати, в VB.net это возможно, хотя и неуклюже, для класса, чтобы безопасно инициализировать поля с вновь созданными экземплярами IDisposable (и гарантировать, что они будут удалены, если какая-либо часть процесса строительства выдает исключение). В С# следует воздерживаться от использования инициализаторов полей для создания чего-либо, что нельзя безопасно оставить, если построение вызывает исключение, поскольку не будет доступа к частично сконструированному объекту для его очистки.

Ответ 4

using System;

class Parent 
 {
    public Parent () {
    Console.WriteLine("Hey Its Parent.");
  }
}

class Derived : Parent 
  {
     public Derived () {
    Console.WriteLine("Hey Its Derived.");
   }
}

class OrderOfExecution {
      static void Main() {
        Derived obj = new Derived();
     }
}

Результат этой программы показан здесь:

Эй, его родитель.

Эй, его результат.

Конструктор действует по-разному в бит наследования, запутанном для новых программистов. Существует два понятия при выполнении конструктора 1. призвание 2. Выполнение Когда вы создаете объект вашего производного класса Named Derived, конструктор сначала переходит в Derived(), тогда он переходит в Parent() из-за его вызова. Конструктор, вызывающий, выполняется от Bottom to Top, но затем вы находите его. Выполняет Parent() сначала, затем Derived, то есть из-за его выполнения. Выполненные конструкторы сверху донизу. Вот почему он сначала печатает Parent, затем Base, в то время как базовый конструктор называется первым.