次のように、クラスに2つのコンストラクターが必要です。
public MyClass()
{
// do stuff here
}
public MyClass(int num)
{
MyClass();
// do other stuff here
}
上記は私の目的を達成するための正しい方法ですか? より良い速記はありますか?
次のように、クラスに2つのコンストラクターが必要です。
public MyClass()
{
// do stuff here
}
public MyClass(int num)
{
MyClass();
// do other stuff here
}
上記は私の目的を達成するための正しい方法ですか? より良い速記はありますか?
public MyClass()
{
// do stuff
}
public MyClass(int num)
: this ()
{
// do other stuff with num
}
この: this()
ビットはConstructor Initializerと呼ばれます。C# のすべてのコンストラクターには、コンストラクター自体の本体の前に実行される初期化子があります。デフォルトでは、初期化子は基本クラスのパラメーターなしのコンストラクターです (またはObject
、クラスが別のクラスから明示的に派生していない場合)。これにより、派生クラスの残りの部分が構築される前に、基底クラスのメンバーが正しく初期化されることが保証されます。
各コンストラクターのデフォルトのコンストラクター初期化子は、2 つの方法でオーバーライドできます。
: this(...)
コンストラクトは、同じクラス内の別のコンストラクターを、それが適用されるコンストラクターの初期化子として指定します 。: base(...)
コンストラクトは、基本クラスのコンストラクターを指定します (通常はパラメーターなしのコンストラクターではありません。これがデフォルトであるためです) 。おそらく必要以上の詳細については、C# 4.0 言語仕様セクション 10.11 を参照してください。
正しい構文は次のようになります。
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 つを呼び出したい場合に便利です。
次のように実行できます。
public MyClass()
{
// do stuff here
}
public MyClass(int num) : this()
{
// do other stuff here
}
パラメーターのデフォルト値を持つ 1 つのコンストラクターを使用する場合があります。
public MyClass(int num = 0)
{
MyClass();
// do other stuff here
}
次のことができます。
public MyClass()
: this(1) { }
public MyClass(int num)
{
//do stuff here
}