代码是什么:base()

时间:2010-10-10 05:45:43

标签: c# class inheritance constructor default-constructor

以下代码中base()的目的是什么?

class mytextbox : TextBox
{
    public mytextbox() : base()
    {
        this.Text = "stack";
    }
} 

为什么在设计时显示消息?

我的代码:

 class Class1:TextBox 
{
 public Class1()
 {
     this.Resize += new EventHandler(Class1_Resize);
 }
  void Class1_Resize(object sender, EventArgs e)
  {
      MessageBox.Show("Resize");
  }
}

alt text

2 个答案:

答案 0 :(得分:10)

代码中的

base()是对myTextBox基类的无参数构造函数的调用,恰好是TextBox。请注意,此基础构造函数将在执行派生类中构造函数的主体之前执行

每个类的构造函数必须最终直接或通过同一类中的链式构造函数调用其基类的构造函数之一。因此,对每个构造函数声明始终存在隐式/显式base(...)或显式this(...)调用。如果省略,则隐式调用base(),即基类的无参数构造函数(这意味着在您的示例中对base()的调用是多余的)。这种声明是否编译取决于基类中是否存在这样的 accessible 构造函数。

修改: 两个小问题:

  1. 类层次结构的根没有基类,因此该规则不适用于System.Object唯一的构造函数。
  2. 第一句应该是:“完成的每个非System.Object类的构造函数必须最终调用其基类的构造函数之一。”这里是一个'乌龟一直向下'的例子,其中从不调用基类的构造函数:实例化这样一个类的对象显然会溢出执行堆栈。

  3. // 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
        }
    }
    

答案 1 :(得分:2)

不知道,这是不必要的。构造函数总是自动调用基类构造函数,而不必显式编写它。但这就是它的含义。如果你不想调用无参数构造函数而不是参数,那么你必须编写它。