ときどき、見たことはあっても使ったことのない構文に出くわします。これはそれらの時間の 1 つです。
C#コンストラクターメソッドに続く「:this」または「:base」の目的を誰かが説明できますか?
例えば:
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
{
}
私の直感では、デフォルト引数を別のコンストラクター メソッドにマップするために使用されます。
ときどき、見たことはあっても使ったことのない構文に出くわします。これはそれらの時間の 1 つです。
C#コンストラクターメソッドに続く「:this」または「:base」の目的を誰かが説明できますか?
例えば:
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
{
}
私の直感では、デフォルト引数を別のコンストラクター メソッドにマップするために使用されます。
あなたは基本的に正しいです。 this()
現在のインスタンスでコンストラクターを呼び出し、現在のインスタンスでbase()
スーパータイプのコンストラクターを呼び出します。これらは通常、コンストラクターのオーバーロードを処理するために使用されるため、別のメソッドに分割することなく追加のオプションを追加できます。
あなたの直感は正しいです。構文は、同じクラスでオーバーロードされたコンストラクターを呼び出すために使用されます。
public class Test
{
public Test() : this("Called from default constructor") { }
public Test(String msg)
{
Console.WriteLine(msg);
}
}
次のコード:
public static void Main(String[] args)
{
Test t1 = new Test();
Test t2 = new Test("Called from Main function");
}
以下を出力します
デフォルトのコンストラクターから呼び出される メイン関数から呼び出される
同様に、: base(someParams)
基本コンストラクターを呼び出すために使用されます。
あなたが正しい。
: base(...)は、基本クラスのコンストラクターを呼び出します。
: this(...)は、定義クラスの別のコンストラクターを呼び出します。ほとんどの場合、それは単なるファサードとして機能します。
.NET クラスのすべてのコンストラクターは、継承元のクラスのコンストラクターも呼び出されるようにします。
したがって、次のクラスがある場合:
public class Base { }
public class Something : Base { }
public class Else : Something { }
Else のコンストラクターは、Something のコンストラクターを呼び出し、Base のコンストラクターも呼び出します。
基本クラス (つまり、派生しているクラス) で呼び出されるコンストラクターは、常にパラメーターなしのコンストラクターです。
持っていない場合、またはそれをオーバーライドしたい場合は、base(ここにいくつかのパラメーター) を指定してオーバーライドできます。これにより、基本クラスで適切なコンストラクターが選択されます。
同じレベルの同じクラスの別のコンストラクターを最初に呼び出すようにコンストラクターに要求することもできます。これは、複数のコンストラクターでコンストラクター コードが重複するのを避けるために使用できます。ただし、最終的には、呼び出されるコンストラクターは基本クラスのコンストラクターを呼び出します。
これが理解できたことを願っています。
丁度。これをコンストラクター チェーンと呼び、C# には既定の引数を実行する機能がないという事実を回避するために使用されます。
これは IoC でよく使用されます。
間違っていなければこんな感じです。
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
電話します
public MyClass(SomethingElse arg, SomeArg arg1) : base or this or nothing
そして、それはあなたが基地を手に入れるか、何も得られなくなるまで続きます.
そのコンストラクターがある場合base(....)
、それを持つコンストラクターは、指定されたパラメーター (存在する場合) を使用して基本コンストラクターを呼び出し、それが独自のコンストラクター (同じゲーム) に委任できます。
何もない場合は、基本クラスのパラメーターなしのコンストラクターが自動的に呼び出されます。
を使用this(....)
した後、パラメータに一致するコンストラクタが使用され、その本体が実行されます - を使用したコンストラクタの本体に加えてthis(....)
。
はい、あなたは正しいです。この構文は、サブクラス コンストラクターが、既定ではなく、適切なカスタム基本クラス コンストラクターを明示的に呼び出すために使用されます。質問の this キーワードについて説明します。
this キーワードのもう 1 つの用途は、冗長なメンバー初期化ロジックを回避するために、1 つのコンストラクターに別のコンストラクターを強制的に呼び出すことです。
In Pro C# 2005 and the .NET 2.0 Platform, 3rd Edition by Andrew Troelsen