私はコンストラクターのトピックに慣れていないので、なぜそれを使用しているのかについて少し混乱していますか? コンストラクターを宣言することと宣言しないことの間に違いはありますか?
4 に答える
コンストラクターは、クラス オブジェクトを初期化するために使用されます。宣言/定義しない場合、デフォルトのコンストラクターが作成されます。
コンストラクターを宣言しない場合、コンパイラーはパラメーターなしでデフォルトのコンストラクターを生成します。
このクラスを考えてみましょう:
public Class X
{
public int A { get; set; }
}
そこにはコンストラクター宣言がないため、コンパイラーは次のようにデフォルトのコンストラクターをそのクラスに配置します。
public Class X
{
public int A { get; set; }
public X ()
{
}
}
クラスでコンストラクターを宣言すると、デフォルトのコンストラクターは生成されません。
public Class X
{
public int A { get; set; }
public X (int a)
{
// do something
}
}
このサンプルでは、デフォルトの空のコンストラクターは生成されません。このようなインスタンスを作成しようとすると:
X obj = new X();
コンパイルエラーが発生します。
詳細 :デフォルト コンストラクター、 C#のコンストラクター
基本クラスのパラメーターなしのパブリック コンストラクターを単に呼び出すパラメーターなしのパブリック コンストラクターを宣言することと、違いはありません。
public class Test
{
public Test() : base() {}
}
次と同等です。
public class Test
{
}
コンパイラは、デフォルトのコンストラクタを提供します。
(そして、そのbase()
部分は暗黙的です。別のコンストラクターに明示的にチェーンしない場合、コンパイラーは、パラメーターなしの基本クラスのコンストラクター1にチェーンしようとしたかのように扱います。)
しかし、それはコンストラクターが役に立たないという意味ではありません...通常、そこにコードを配置します。通常、パラメーターをコピーします。
public class Test
{
private readonly string name;
public Test(string name)
{
this.name = name;
}
}
...しかし、コンストラクターには通常のメソッドとほとんど同じコードを含めることができます。ただし、コンストラクターの実行中は、派生クラスのコンストラクター本体がまだ実行されていないため、オブジェクトが完全に初期化されていない可能性があることに注意してください。このため、コンストラクター内で仮想メソッドを呼び出さないことをお勧めします。
一般的なインスタンス コンストラクターの詳細については、C# 5 仕様のセクション 10.11 を参照してください。既定のコンストラクターの詳細については、セクション 10.11.4 を参照してください。
1より具体的には、あなたが書いたかのように連鎖しますbase()
。パラメーターなしのコンストラクターはなく、パラメーターがすべてオプションのコンストラクターがある場合は、それが呼び出されます。
コンストラクターは、クラスの多くのことに使用されます。
クラスのインスタンスの初期化で何かをしたい場合。
public class MyClass { private string myWork = string.Empty; public MyClass() { myWork = "Started"; } }
クラスのオブジェクト作成の範囲を限定したい場合
public class MyClass { private string myWork = string.Empty; protected MyClass() { myWork = "Started"; } }
基本クラスのサポートなど、他にも多くのことがあります。MSDN でも検索してください。