7

次のように、クラスに2つのコンストラクターが必要です。

public MyClass()
{
    // do stuff here
}

public MyClass(int num)
{
    MyClass();
    // do other stuff here
}

上記は私の目的を達成するための正しい方法ですか? より良い速記はありますか?

4

5 に答える 5

12
public MyClass()
{
    // do stuff
}

public MyClass(int num)
    : this ()
{
    // do other stuff with num
}

この: this()ビットはConstructor Initializerと呼ばれます。C# のすべてのコンストラクターには、コンストラクター自体の本体の前に実行される初期化子があります。デフォルトでは、初期化子は基本クラスのパラメーターなしのコンストラクターです (またはObject、クラスが別のクラスから明示的に派生していない場合)。これにより、派生クラスの残りの部分が構築される前に、基底クラスのメンバーが正しく初期化されることが保証されます。

各コンストラクターのデフォルトのコンストラクター初期化子は、2 つの方法でオーバーライドできます。

  1. : this(...)コンストラクトは、同じクラス内の別のコンストラクターを、それが適用されるコンストラクターの初期化子として指定します 。
  2. : base(...)コンストラクトは、基本クラスのコンストラクターを指定します (通常はパラメーターなしのコンストラクターではありません。これがデフォルトであるためです) 。

おそらく必要以上の詳細については、C# 4.0 言語仕様セクション 10.11 を参照してください。

于 2012-08-17T05:12:30.717 に答える
5

正しい構文は次のようになります。

public MyClass() 
{ 
    // do stuff here 
} 

public MyClass(int num) : this()
{ 
    // do other stuff here 
} 

this()2 番目のコンストラクターの at に注意してください。これは、パラメーターなしで同じクラスのコンストラクターを呼び出します。

また、逆にすることもできます。

public MyClass() : this(someReasonableDefaultValueForNum)
{ 
} 

public MyClass(int num)
{ 
    // do all stuff here 
} 

thisこの場所の代わりに使用できる「関数」がもう 1 つだけありますbase

public MyClass(int num) : base(someParameterOnTheBaseClassConstructor)
{
}

これは、基本クラスで既定のパラメーターなしのコンストラクターを呼び出すのではなく、パラメーターを受け取るコンストラクターの 1 つを呼び出したい場合に便利です。

于 2012-08-17T05:12:40.730 に答える
2

次のように実行できます。

public MyClass()
{
    // do stuff here
}

public MyClass(int num) : this()
{

    // do other stuff here
}
于 2012-08-17T05:12:25.833 に答える
2

パラメーターのデフォルト値を持つ 1 つのコンストラクターを使用する場合があります。

public MyClass(int num = 0)
{
    MyClass();
    // do other stuff here
}
于 2012-08-17T05:12:35.613 に答える
0

次のことができます。

public MyClass()
   : this(1) { }

public MyClass(int num)
{
   //do stuff here
}
于 2012-08-17T05:14:09.477 に答える