base()
в вашем коде - это вызов конструктора без параметров базового класса myTextBox
, который равен TextBox
.Обратите внимание, что этот базовый конструктор будет выполнять перед выполнением тела конструктора в производном классе.
Конструктор каждого класса должен в конечном итоге вызывать один из его базового классаконструкторы, напрямую или через цепочечные конструкторы в одном классе.Следовательно, всегда существует неявный / явный base(...)
или явный this(...)
вызов каждого объявления конструктора.Если он опущен, существует неявный вызов base()
, то есть конструктор без параметров базового класса (это означает, что вызов base()
в вашем примере является избыточным).Компилируется ли такое объявление или нет, зависит от того, существует ли в базовом классе такой доступный конструктор.
РЕДАКТИРОВАТЬ : две тривиальные точки:
- Корень иерархии классов не имеет базового класса, поэтому это правило не применяется к
System.Object
единственный конструктор. - Первое предложение должно гласить: «Конструктор каждого не
System.Object
класса, который успешно завершает , должен в конечном итоге вызвать один из его базового класса.конструкторы «.Вот пример с «черепашками на всем пути», где конструктор базового класса никогда не вызывается: создание экземпляра объекта такого класса, очевидно, переполнит стек выполнения.
// Contains implicit public parameterless constructor
public class Base { }
// Does not contain a constructor with either an explicit or implicit call to base()
public class Derived : Base
{
public Derived(int a)
: this() { }
public Derived()
: this(42) { }
static void Main()
{
new Derived(); //StackOverflowException
}
}