Base Конструктор называется первым. Но инициализатор полей в производном классе называется первым.
10.11.3 Конструктор
Инициализаторы переменных преобразуются в операторы присваивания, и эти операторы присваивания выполняются перед вызовом экземпляра конструктора базового класса . Это упорядочение гарантирует, что все поля экземпляров инициализируются их инициализаторами переменных перед выполнением любых операторов , имеющих доступ к этому экземпляру. Учитывая пример
using System;
class A
{
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}
class B: A
{
int x = 1;
int y;
public B() {
y = -1;
}
public override void PrintFields() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
, когда new B()
используется для создания экземпляра B
, следующий выход производится:
x = 1, y = 0
Значение x
равно 1, так как переменная инициализатор выполняется перед вызывается конструктор экземпляра базового класса. Однако значение y
равно 0 (значение по умолчанию int
), так как присвоение до y
не выполняется до тех пор, пока не будет возвращен конструктор базового класса. Полезно придумать инициализаторы переменных экземпляра и инициализаторы конструктора в качестве операторов, которые автоматически вставляются перед корпусом-конструктором. Пример
using System;
using System.Collections;
class A
{
int x = 1, y = -1, count;
public A() {
count = 0;
}
public A(int n) {
count = n;
}
}
class B: A
{
double sqrt2 = Math.Sqrt(2.0);
ArrayList items = new ArrayList(100);
int max;
public B(): this(100) {
items.Add("default");
}
public B(int n): base(n – 1) {
max = n;
}
}
содержит несколько переменных инициализаторов; он также содержит конструкторы инициализаторы обеих форм (базовые и это). Пример соответствует приведенному ниже коду, где каждый комментарий указывает автоматически вставленный оператор (синтаксис, используемый для автоматически вставленных вызовов конструктора , недопустим, а служит только ).
using System.Collections;
class A
{
int x, y, count;
public A() {
x = 1; // Variable initializer
y = -1; // Variable initializer
object(); // Invoke object() constructor
count = 0;
}
public A(int n) {
x = 1; // Variable initializer
y = -1; // Variable initializer
object(); // Invoke object() constructor
count = n;
}
}
class B: A
{
double sqrt2;
ArrayList items;
int max;
public B(): this(100) {
B(100); // Invoke B(int) constructor
items.Add("default");
}
public B(int n): base(n – 1) {
sqrt2 = Math.Sqrt(2.0); // Variable initializer
items = new ArrayList(100); // Variable initializer
A(n – 1); // Invoke A(int) constructor
max = n;
}
}
Вы правы. Но выполнение начинается с производного конструктора, первое, что делает производный конструктор, - это вызов базового конструктора (если он есть). Таким образом, кажется, что сначала вызывается базовый конструктор. – 2017-08-16 14:50:58