デフォルトのコンストラクターにはパラメーターがありません。また、パラメーターなしで作成するコンストラクターもありません。では、C#の最終的な違いは何ですか?
デフォルトのコンストラクターとパラメーターのないコンストラクターを継承するときにこれに追加されますが、継承する型でまったく同じように公開されますか?私のIOCコンテナはそうは思わないからです。(団結)。
乾杯、ピート
デフォルトのコンストラクターにはパラメーターがありません。また、パラメーターなしで作成するコンストラクターもありません。では、C#の最終的な違いは何ですか?
デフォルトのコンストラクターとパラメーターのないコンストラクターを継承するときにこれに追加されますが、継承する型でまったく同じように公開されますか?私のIOCコンテナはそうは思わないからです。(団結)。
乾杯、ピート
クラスに明示的なインスタンス コンストラクターが含まれていない場合、C# コンパイラによって "既定の" コンストラクターが追加されます。これはpublicのパラメーターなしのコンストラクターです。明示的な非パブリックのパラメーターなしのコンストラクターを作成した場合、Unity はパブリック コンストラクターを使用した場合と同じ方法でそれを使用できません (これがコンパイラーによって生成されたかどうかに関係なく、パラメーターがあったかどうかに関係なく)。 )。
パラメーターなしのコンストラクターを作成することで、既定のコンストラクターの動作をオーバーライドできます。これの一般的な使用法は、クラスのメンバーとしてカスタム オブジェクトがあり、クラスのインスタンスが作成されたときにデフォルト値で初期化する必要がある場合です。
デフォルトのコンストラクターは、パラメーターなしのコンストラクターの同義語です。
@Sachin Kainth および @Fredrik Leijon の回答に追加すると、.NET (Java でも) コンストラクターは継承されません。
基本コンストラクターを明示的に呼び出すか、デフォルトで基本パラメーターなしコンストラクターが呼び出されます。
コンストラクターを追加しない場合は、パラメーターのないデフォルトのコンストラクターが挿入されます。コンストラクター(パラメーターありまたはなし)を追加すると、デフォルトのコンストラクターは生成されません
より多くのコンストラクターが必要な場合は、パラメーターなしのコンストラクターが必要になる場合があります。パラメータなしのものとパラメータ付きのものを考えてみましょう。
クラスにパラメーターを持つコンストラクターしかない場合、パラメーターなしのコンストラクターを定義しない限り、パラメーターなしのコンストラクターを使用することはできません。つまり、クラスでカスタム コンストラクターを定義する場合、既定のパラメーターなしのコンストラクターは提供されません。
コード自体に語らせます。
public class ThisHasADefaultConstructor
{
}
public class ThisHasAParameterlessConstructor
{
public ThisHasAParameterlessConstructor()
{
}
}
デフォルトのコンストラクターは事実上、コンストラクターを指定しない場合 (パラメーターの有無にかかわらず) に自動的に生成されるパラメーターなしのコンストラクターであることに注意してください。
MSDNの状態:
パラメーターを取らないコンストラクターは、既定のコンストラクターと呼ばれます。new 演算子を使用してオブジェクトがインスタンス化され、new に引数が指定されていない場合は常に、既定のコンストラクターが呼び出されます。
したがって、デフォルトのコンストラクターを自動的に生成する必要はありません。手書きのパラメーターなしのコンストラクターも、既定のコンストラクターです。
これは、派生クラスを見ると実際に理にかなっています。
class A
{
public A() { ... } // do something
public A(object o) { ... } // do something else
}
class B
{
public B() { ... }
}
B の作成中にどの A コンストラクターが呼び出されますか? デフォルトのもの。
デフォルトのコンストラクターは、自動的に作成されたか、ユーザーが作成したかに関係なく、パラメーターのないコンストラクターを指します。
パラメーターの有無にかかわらず、他のインスタンス コンストラクターを宣言しない場合、既定のコンストラクターが自動的に作成されます。(静的コンストラクターを宣言しても、デフォルトのコンストラクターが自動的に作成されることは避けられません)。
クラスの階層のコンストラクターは継承されませんが、派生クラスのコンストラクターを使用すると、継承チェーンのすべてのコンストラクターが階層のルートから呼び出されます。呼び出すコンストラクターを指定しない限り、各クラスの既定のコンストラクターが呼び出されます。
public class Base
{
public Base()
{
}
}
public class Derived : Base
{
public Derived()
{
}
}
// invokes, the Base() construtor, and then the Derived() constructor
var d = new Derived();
次のように、パラメーターの有無にかかわらず、基本クラスのコンストラクターを明示的に呼び出すこともできます。
// Derived class explicitly invoking base class constructor.
public Derived() :base()
{
}
必要に応じて、次のようなパラメーターを使用して基本クラスのコンストラクターを呼び出すことができます。
public Derived(int j) :base(j)
とか、ぐらい
public Derived() :base(23)
この最後のコード サンプルでは、既定のコンストラクターを使用して Derived オブジェクトを作成する場合、基本クラスで呼び出されるコンストラクターは既定のコンストラクターではなく、パラメーター 23 で呼び出される整数パラメーターを持つコンストラクターです。
(もちろん、このパラメーター付きのコンストラクターは Base クラスに存在する必要があります)。
中間基本クラスのコンストラクターのみを明示的に呼び出すことができます。
デフォルトのコンストラクターは、(パラメーターなしで) 新しいコンストラクターを明示的に作成した場合を除き、コンパイラーによって暗黙的に呼び出されます。