電気系プログラミングガチ素人学生がC#のクラスを勉強する話　7日目~静的クラス、仮引数、名前付き引数~

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

・・・就活？知らない子ですね

#静的クラス→クラスのインスタンス化を禁止する
Mathクラスとかをインスタンス化されたら迷惑ですよね？（定義が書き換わるから）
関数を作っておいて、それを変更されたくないような時に使います


#様々な引数
##引数の規定値

```C#
using System;

namespace _7._6._1
{
    class Person{
        public string FirstName{get;set;}
        public string LastName{get;set;}

        public void Show(string greeting = "こんにちは",string title = "さん"){//これが仮引数。

            Console.WriteLine($"{greeting},{this.LastName}{this.FirstName}{title}!");//もはや日本語が消えてしまった
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person(){
            FirstName="山田",
            LastName="太郎"
            };

            p.Show();

            p.Show(Console.ReadLine());//今回はここで値をいつでも入力できるようにしました
        }
    }
}
```
結果は以下のようになりました。

```
こんにちは,太郎山田さん!
初めまして
初めまして,太郎山田さん!
```
入力した値もきちんと反映されてますね！これが<b>仮引数と、その代入の方法でです！</b>
引数の省略は後方のみで、前方を省略することはできません。
逆に、後方だけ入力しても、認識されませんので、ご注意を。

この欠点を補うような形であるのが、<b>名前付き引数です</b>

###ちなみに
```C#
using System;

namespace _7._6._1
{
    class Person{
        public string FirstName{get;set;}
        public string LastName{get;set;}

        public void Show(string greeting = "こんにちは",string title = "さん"){

            Console.WriteLine($"{greeting},{this.LastName}{this.FirstName}{title}!");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person(){
            FirstName="山田",
            LastName="太郎"
            };

            p.Show();

            string [] input =Console.ReadLine().Split(' ');

          p.Show(input[0],input[1]);
        }
    }
}
```
とするとこのような結果になります。

```
こんにちは,太郎山田さん!
初めまして　 様
初めまして,太郎山田様!
```

##名前付き引数
さっきの呼称の指定をするのであれば、以下にしましょう。

```C#
using System;

namespace _7._6._1
{
    class Person{
        public string FirstName{get;set;}
        public string LastName{get;set;}

        public void Show(string greeting = "こんにちは",string title = "さん"){

            Console.WriteLine($"{greeting},{this.LastName}{this.FirstName}{title}!");
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            var p = new Person(){
            FirstName="山田",
            LastName="太郎"
            };

            p.Show();

            p.Show(title:Console.ReadLine());//名前付き引数
        }
    }
}

```

ネーミングの重要性についてはおそらくベテランエンジニアさんであればあるほど気づくと思われます。
このような場面で、ネーミングがひどいとどこに何があるか確かにわかったもんじゃないですね。
この名前付き引数のメリットは、

* 引数が多くなっても、意味を理解しやすい
* 必要な引数だけを代入できるため、省略が任意に可能
* 引数の順序を自由に変更可能

無論、呼び出しのせいで、コードが冗長になるというデメリットも存在しますが、コードの引き数が多かったり、省略可能な引き数が多ければ、この方法を使うメリットは十分にあるでしょう。
ただし、<b>仮引数の変更は呼び出し側にも影響する可能性がある。</b>

#可変長引数のメソッド
引数を可変長にした方が便利な場合があります。

```C#
using System;

namespace _7._6._3
{
    class ArgsParams{
            public int TotalProducts(params int[] values) {
            int result = 1;
            foreach(var value in values){
                result *= value;
            }
            return result;
        } 
    }
    class Program
    {

        static void Main(string[] args)
        {
            var v = new ArgsParams();
          Console.WriteLine(v.TotalProducts(12,15,-1));  
          Console.WriteLine(v.TotalProducts(5,7,8,2));
        }
    }
}
```

結果は以下のようになりました

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
-180
560
```

#あとがき
最近PHPの勉強をはじめました。自分で作ってみたいサービスがあるので・・・
あとはそのノウハウを誰かから聞き出したり、この記事で見つけ出していって・・・
仕事に生かせるレベルまで引き上げないと・・・

この勉強も生かされてるようで、理解はかなり早くなりました。
染まりやすいというかなんというか・・・