エンジニアの将来って?

現在7年目のCOBOL→Java→C#エンジニアが、将来への考えや勉強のアウトプット、たまに腎臓について書くブログです

【C#】コンストラクタからコンストラクタを呼ぶ、コンストラクタ初期化子について解説します

こんにちは。たいら(@tairaengineer2)です。
この記事では、C#コンストラクタからコンストラクタを呼ぶやり方について解説します。

 

前提条件

この記事では、Visual Studio 2017 Communityを使っています。
インストールの仕方は、下の記事をご参考ください。

www.tairax.com

コンストラクタからコンストラクタを呼ぶためには

コンストラクタ初期化子という仕組みを使います。

書き方は

namespace ConsoleApp1
{
    class Animal
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Animal() : this("名無し")
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="name">名前</param>
        public Animal(string name)
        {
            Name = name;
        } 

        /// <summary>
        /// 名前
        /// </summary>
        public string Name { get; set; }
    }
}

thisをつけて、呼びたいコンストラクタの引数の数に合うように引数を設定してあげると、コンストラクタからコンストラクタを呼ぶことができます。

これは、引数が異なるコンストラクタを簡単にそしてシンプルに作ることができるので、便利な機能だと思います。

では、実際に使ってみます。

解説するプログラムの内容

引数が異なる複数のコンストラクタを使ってインスタンスを作成します。
それぞれのインスタンスのプロパティをコンソールに表示させるプログラムです。

コンソールプロジェクトを作成するやり方は下の記事をご参考ください。

www.tairax.com

C#プログラム

プログラムは2つ作りました。
メインとインスタンスを作成するプログラムです。

インスタンス作成用プログラム

using System;

namespace ConsoleApp1
{
    /// <summary>
    /// Humanクラス
    /// </summary>
    class Human
    {
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public Human() : this("無名")
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="name">名前</param>
        public Human(string name) : this(name, 0)
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="name">名前</param>
        /// <param name="age">年齢</param>
        public Human(string name, int age) : this(name, age, "無趣味")
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="name">名前</param>
        /// <param name="age">年齢</param>
        /// <param name="hobby">趣味</param>
        public Human(string name, int age, string hobby)
        {
            Name = name;
            Age = age;
            Hobby = hobby;
        }

        /// <summary>
        /// プロパティを表示
        /// </summary>
        public void Display()
        {
            Console.WriteLine("Name:{0}", Name);
            Console.WriteLine("Age:{0}", Age);
            Console.WriteLine("Hobby:{0}", Hobby);
        }

        /// <summary> 名前 </summary>
        public string Name { get; set; }
        /// <summary> 年齢 </summary>
        public int Age { get; set; }
        /// <summary> 趣味 </summary>
        public string Hobby { get; set; }
    }
}

メイン用プログラム

using System;

namespace ConsoleApp1
{
    /// <summary>
    /// コンストラクタからコンストラクタを呼ぶクラス
    /// </summary>
    class Program
    {
        /// <summary>
        /// メイン
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // 引数が異なるコンストラクタを3つ作成
            Human noman = new Human();
            Human suzuki = new Human("鈴木");
            Human sato = new Human("佐藤", 32);
            Human tanaka = new Human("田中", 48, "釣り");

            // それぞれを表示
            string line = new string('-', 10);
            Console.WriteLine("引数無を表示");
            noman.Display();
            Console.WriteLine(line);
            Console.WriteLine("引数が1つを表示");
            suzuki.Display();
            Console.WriteLine(line);
            Console.WriteLine("引数が2つを表示");
            sato.Display();
            Console.WriteLine(line);
            Console.WriteLine("引数が3つを表示");
            tanaka.Display();
        }
    }
}

実行結果

f:id:Tairax:20190203200144p:plain

引数無を表示
Name:無名
Age:0
Hobby:無趣味
----------
引数が1つを表示
Name:鈴木
Age:0
Hobby:無趣味
----------
引数が2つを表示
Name:佐藤
Age:32
Hobby:無趣味
----------
引数が3つを表示
Name:田中
Age:48
Hobby:釣り
続行するには何かキーを押してください . . .

では、解説します。

解説

コンストラクタを呼ぶ引数の数ごとに解説します。

引数無のコンストラクタ

引数無のコンストラクタは、このように呼ばれています。

f:id:Tairax:20190203201730p:plain

コンストラクタ初期化子で指定しているものが、設定されて次のコンストラクタを読んでいます。
最終的には

Name 無名
Age 0
趣味 無趣味

という風に設定されています。

引数が1つのコンストラクタ

引数が1つのコンストラクタは、このように呼ばれています。

f:id:Tairax:20190203205212p:plain

コンストラクタ初期化子で指定しているものが、設定されて次のコンストラクタを読んでいます。
最終的には

Name 鈴木
Age 0
趣味 無趣味

という風に設定されています。

引数が2つのコンストラクタ

引数が2つのコンストラクタは、このように呼ばれています。

f:id:Tairax:20190203205501p:plain

コンストラクタ初期化子で指定しているものが、設定されて次のコンストラクタを読んでいます。
最終的には

Name 佐藤
Age 32
趣味 無趣味

という風に設定されています。

引数が3つのコンストラクタ

引数が3つのコンストラクタは、このように呼ばれています。

f:id:Tairax:20190203205712p:plain

thisが無いので、コンストラクタを呼ばずこの中で処理をしています。
最終的には

Name 田中
Age 48
趣味 釣り

という風に設定されています。

まとめ:コンストラクタ初期化子を使おう!

以上がコンストラクタからコンストラクタを呼ぶ、コンストラクタ初期化子の解説です。

引数が異なるコンストラクタを作りたいときは、コンストラクタ初期化子を使いましょう!

あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ

 

ほかにもC#勉強記事を書いてます。
よければご参考ください。

【C#】xmlを読み込む、XDocumentとXElementについて解説します。

【C#】配列からListに変換するやり方を解説します

【C#】【LINQ】Aggregateメソッドの使い方を解説します