LoginSignup
1
1

More than 5 years have passed since last update.

電気系プログラミングガチ素人学生がC#のクラスを勉強する話 4日目 ~コンストラクタ~

Last updated at Posted at 2018-04-21

まえがき

このレポートはSkype勉強会での活動を「書面としてアウトプットする」こと、「電気系の学生の成果物を作るための意識高い系のレポート」です。完全初心者なので、勉強会参加者の先輩たちから様々なツッコミを頂きながら書いております。それゆえに先輩たちの目から外れた誤字脱字等ございますが、ぜひともツッコミいただいて、私の勉強にさせていただければと思います。

コンストラクタ

ここまで無視されてきたコンストラクタですが、フィールドの初期化や、クラス内部で利用する外部リソースの準備といった、処理を記述するのが一般的なようです。このコンストラクターにはルールがあります。
1.指定出来る修飾子はアクセス修飾子
2.戻り値はもたない
voidとはちがい、戻り値の型そのものを指定してはならない!
3.名前はクラス名と一致する事。

コンストラクターを体験する実装をしてみよう

こんな感じにコードを書きました。

using System;

namespace _4._1._18
{
    class Person{
    public string FirstName{set;get;}
    public string LastName{set;get;}

    //これがコンストラクター
    public Person (string firstName,string lastName){
        this.FirstName = firstName;
        this.LastName = lastName;
    }//

    public string Show(){
        return $"名前は{this.LastName}{this.FirstName}です";

    }


    }
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person ("太朗","山田");//引数をこれで指定
            Console.WriteLine(p.Show());
        }
    }
}

このように、すると、出力はこんなふうに出てきました。

-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
名前は  山田太朗です

コンストラクターでは、引数FirstName,LastNameの値をそれぞれ、対応するフィールドにセットしています。

今までコンストラクターを無視できていた理由

自動で空のデフォルトコンストラクターが、生成されていたから!
ただし、これに頼り切っていると、あとから引き数付きのコンストラクターを追加した場合は、っデフォルトコンストラクターに頼ったコードは軒並み、エラーとなる訳です。
この様な場合、まずは空であっても、明示的にコンストラクターを定義するのが無難です。

コンストラクタのオーバーロード

コンストラクタも、メソッドと同じく、複数のシグニチャー(名前以外の引数の型・並びのこと)を持つ事が可能です。これをコンストラクタのオーバーロードといいます。

例えば、

public StringBuilder()
public StringBuilder(string value)
public StringBuilder(int capacity,int MaxCapacity)

はオーバーロードできるわけですね。(名前が同じでも、引数の中身(型、並び)が違うから。= シグニチャが違うから)

以下のコードは、PersonクラスのFirstName/LastNameフィールドを、コンストラクターで初期化する例です。FirstName/LastNameフィールドを明示させるコンストラクターとこれらを省略できる、デフォルトコンストラクターを定義しています。

using System;

namespace test2
{
    class Person{
        public string FirstName{set;get;}
        public string LastName{set;get;}

        //コンストラクター(フィールドの初期値を明示)
        public Person(string firstName,string lastName){
            this.FirstName = firstName;
            this.LastName = astName;
        }

        //コンストラクター(引数を省略)
        public Person () :this("權兵衞","名無し"){}

        public void Show(){
            Console.WriteLine($"名前は{this.LastName}{this.FirstName}です。");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person();
            p.Show();
        }
    }
}

そうすると、以下のように出力されました。

-------------------------------------------------------------------
You may only use the Microsoft .NET Core Debugger (vsdbg) with
Visual Studio Code, Visual Studio or Visual Studio for Mac software
to help you develop and test your applications.
-------------------------------------------------------------------
名前は名無し權兵衞です。

コンストラクターというものを原理的に理解しないと恐らくこんがらがっちゃいますね・・・

あとがき

最近、筋トレをしながら、ほどよく疲れておくことを意識しています。
というのも、運動不足で体重がやばくて・・・(笑)

VSCodeの動かしかたにも少し慣れて来ました。今度は、pythonなども動かせるようになりたいです!

初日

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1