2

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");
  }
}

代替テキスト

4

2 に答える 2

10

base()あなたのコードでは、 の基本クラスのパラメーターなしのコンストラクターへの呼び出しmyTextBoxですTextBox。この基本コンストラクターは、派生クラスのコンストラクターの本体が実行される前に実行されることに注意してください。

すべてのクラスのコンストラクターは、最終的に、直接または同じクラス内の連鎖コンストラクターを介して、その基本クラスのコンストラクターの 1 つを呼び出す必要があります。したがって、すべてのコンストラクター宣言には常に暗黙的/明示的base(...)または明示的なthis(...)呼び出しがあります。省略した場合、 への暗黙的な呼び出し、つまり、基本クラスのパラメーターなしのコンストラクターが存在します (これは、例での への呼び出しが冗長であることを意味します)。このような宣言がコンパイルされるかどうかは、基本クラスにそのようなアクセス可能なコンストラクターが存在するかどうかによって異なります。base()base()

EDIT:2つの些細な点:

  1. クラス階層のルートには基本クラスがないため、この規則はSystem.Objectの唯一のコンストラクターには適用されません。
  2. 最初の文は次System.Objectのようなります。これは、基本クラスのコンストラクターが呼び出されない 'turtles all the down' の例です。このようなクラスのオブジェクトをインスタンス化すると、明らかに実行スタックがオーバーフローします。

// 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
    }
}
于 2010-10-10T05:51:35.143 に答える
2

わかりません、それは不要です。コンストラクターは、明示的に記述しなくても、常に基本クラスのコンストラクターを自動的に呼び出します。しかし、それはそれが意味することです。パラメーターなしのコンストラクターを呼び出したくないが、引数を取るコンストラクターを呼び出したくない場合は、それを記述する必要があります。

于 2010-10-10T05:48:44.530 に答える