電気系プログラミングガチ素人学生がC#のクラスを勉強する話　5日目　~オブジェクト初期化子とデストラクタ―~

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

# 前回までのあらすじ！
コンストラクターは設定しておくといいぞ！

# オブジェクト初期化子
初日に書いたコードをコメントアウトして、オブジェクト初期化子を書いて見ました

```C#
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace class_replay{//名前空間。クラスを分割している。名前の衝突を防ぐ。
    class Person //Personクラスを宣言。（位置はNamespaceの中かつ、他のクラスの外） 
    {   public string FirstName{get;set;}//Publicは他のクラスからアクセス可能
        public string LastName{get;set;} //stringはLastName、FirstNameの型  
    }


    class Program
    {

        static void Main(string[] args)
        {
          /*var p1 = new Person();//Personクラスでp1という名前でインスタンス化

          p1.FirstName="太郎";//p1というｙFirstNAMEの属性に、太郎を代入
          p1.LastName="山田";*/

          var p = new Person{
              LastName = "山田",
              FirstName = "太朗"
          };//このセミコロンを忘れないように！

          var p2 = new Person();
          p2.FirstName="花子";
          p2.LastName="山田";

          Console.WriteLine($"{p.LastName}{p.FirstName}");//$は{}内の指示語展開のスイッチ（C#6で搭載）
          Console.WriteLine($"{p2.LastName}{p2.FirstName}");

        }
    }
}

```

出力は以下のように、当然のことながらなりました。

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
山田太朗
山田花子

```

ただし、便利だからと言って、利用する時は注意が必要です！

##（１）初期化子に記述できるのは、アクセス可能なメンバーだけ
一般的にかけるのは、publicなメンバーだけ！（コンストラクターと異なり、あくまでクラスの外からのアクセスとなってしまうため）

##（２）初期化の順番に注意
オブジェクトの実行手順は、

1,フィールドの初期化
2,コンストラクター
3,オブジェクト初期化子
と、一番下なので、最終的に以下の様なコードを描いた場合は、initializerになります。
ただし、initializerの部分を削除すると、constlucterに、同じように削除して行くと、今度はfieldになるので、おためしあれ。

```C#
using System;

namespace class_basic
{
    
    class Hoge{
        public Hoge(){}

        public string value = "field";

        public Hoge (string value){
            this.value = value;
        } 


    }
    class AnonimusInit
    {
        static void Main(string[] args)
        {
            var h = new Hoge ("constructor"){value = "initializer"};//それぞれの（）{}で、コメントアウトすると、結果が変わるよ☆

            Console.WriteLine(h.value);
        }
    }
}

```

で、やると以下のように出力されます。

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
initializer

```

#デストラクター
名前が厨二っぽいですよね。デストラクター。オブジェクトの破棄に使用されるようです。その為あってかあまり利用されないそうです。

注意事項としては
* 名前は、「〜」（チルダ）+　クラス名で固定
* 修飾子/引数/戻り値ともに持てない
* オブジェクト破棄時に自動で呼び出さられる（明示的な呼び出しはできない）

以下にサンプルをつくりました。

```C#
using System;

namespace class_basic
{
    class MyProcess
    {
        public MyProcess()
        {
            Console.WriteLine("constructor");
        }

        ~MyProcess()
        {
            Console.WriteLine("destructor");

        }
    }

    
    class Destruct_Basic
    {
        static void Main(string[] args)
        {
            var mp = new MyProcess();
        }
    }
}
```

実行結果は、

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
constructor
destructor

```
のはずですが・・・・

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
constructor

```

できてないやんけぇ・・・（そいつはひでぇや）

というのも、どうやら、.NETがガーベージコレクションしてしまうので、デストラクタは実行されません。
面白い仕組みですね。

#あとがき
勉強会の、Skypeのリソースがデカイのか、ルーターが調子わるいのか・・・
ちょっとネットワークが不調でした。

伝わりやすい初心者向けのコンテンツを作って行くこと、それが出来れば幸いですね。