コンストラクタって何なのでしょうか?
C# 入門したときに、自分の中に全く消化できないものでした。
勉強を始めて、自分の中に落とし込めた部分をメモしたいと思います。
コンストラクタは
・new したときに呼び出されるメソッド
・クラスと同じ名前
・戻り値はない
コンストラクタはインスタンスを初期化するために存在します。 以下のClassAメソッドがコンストラクタです。
class OriginClass { public void MainOrigin() { var classA = new ClassA(); } } class ClassA { public ClassA() { Console.WriteLine("ClassAです。"); } }
ClassA をnew すると以下の出力が得られます。
ClassAです。
ClassA のコンストラクタが呼び出されているのがわかりますね。
次のサンプルはどうでしょうか?
class OriginClass { public void MainOrigin() { var classB = new ClassB(); classB.MainClassB(); } } class ClassB { public void MainClassB() { Console.WriteLine("MainClassBです。"); } }
今回はコンストラクタが存在していませんね。
ではnewしたときに何を呼び出しているのでしょうか?
C#では、クラスのコンストラクタを明示的に定義しないと
引数のない既定のコンストラクタが使われるのです。
1つでもコンストラクタを設定すると、既定のコンストラクタは生成されません。
次にコンストラクタで初期化をしてみましょう。
class OriginClass { public void MainOrigin() { var classC = new ClassC(10); Console.WriteLine("OriginClassです。"); Console.WriteLine($"Num = {classC.Num}"); } } class ClassC { public int Num; public ClassC(int num) { Console.WriteLine("ClassCです。"); this.Num = num; } }
出力は以下のようになります。
ClassCです。 OriginClassです。 Num = 10
new した時の値でClassCのNumが初期化されていますね。
コンストラクタで初期化しなかった場合はどうなるのでしょう。
class OriginClass { public void MainOrigin() { var classD = new ClassD(); Console.WriteLine("OriginClassです。"); Console.WriteLine($"Num = {classD.Num}"); Console.WriteLine($"Text = {classD.Text}"); } } class ClassD { public int Num; public string Text; }
上記のサンプルを実行すると以下の警告が出てきます。
warning CS0649: フィールド 'ClassD.Num' は割り当てられません。常に既定値 0 を使用します。 warning CS0649: フィールド 'ClassD.Text' は割り当てられません。常に既定値 null を使用します。
出力結果は以下のようになります。
OriginClassです。 Num = 0 Text =
C#の既定のコンストラクタを使うと、各データ型の既定値で初期化されていますね。
コンストラクタを勉強すると奥が深いようです。
私も引き続き理解を深めていかないとです…。