電気系プログラミングガチ素人学生がC#のクラスを勉強する話　9日目~値渡しと、参照渡し~

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

#スタートライン
https://qiita.com/sanbongazin/items/d87d1f99859e35710486

#前回のC＃！！（ラブライブ風に）
#値渡しと参照渡し
値渡しと、参照渡しはよくご存知かと。しかし、C＃では、データ型の値型/参照型が絡んでくると、

* 値型の参照渡し
* 参照型の値渡し
* 値型の値渡し
* 参照型の参照渡し

##値型の値渡し

```C#
using System;

namespace Basic
{
    class Program
    {
        public int CountUp(int data)
        {
            data++;
            return data;
        }
        static void Main(string[] args)
        {
            var data = 1; //上のCountUpのdataと、このdataは別物！
            var p = new Program();
            Console.WriteLine(p.CountUp(data));
            Console.WriteLine(data);
        }
    }
}
```

値渡しとは、実引数（呼び出し元の値）をメソッド側の仮引数にコピーすることを言います。

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

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
2
1
```

#参照型の値渡し
しかし、ここに参照型が絡んでくると、話が複雑になるようですね。

```C#
using System;

namespace refarence_stile
{
    class Program
    {
        public int [] Update(int [] data){
            data[0] = 5;
            return data; //配列のなかの値を返す
        } 
        static void Main(string[] args)
        {
            var data = new [] {2,4,6};

            var p = new Program();
            Console.WriteLine(p.Update(data)[0]);//予想：この場合はクラスのインスタンスから、５を返すようなプログラムとなっているため。
            Console.WriteLine(data[0]);//予想：本来は、２が返される筈だが、先ほどの実行で、値がセットされ、0番地に、５が代入されているため、５を返す。
        }
    }
}

```

解説すると、0番地にあった値：２は、Console.WriteLine(p.Update(<b>data</b>)[0]);の記述により、参照型のポインタの値（例えるならば、ネットのURL）が渡されてしまいます。ここで、代入する参照先を変更しています。（２＝＞５になったのは、参照先で２を返していた、０番地が、値５を格納したから・・・？）ネットのURLなら、リンク先の変更といったところでしょうか。

＝＞こちらは値が切り替わるパターン
出力が以下となります。

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

```
で、実はメモリ番地が切り替わってしまうパターンもあります。配列が、新しく生成された際は以下のような結果になります（<b>紛らわしいポイント１</b>）

```C#
using System;

namespace PassArray
{
    
    class Program
    {
        public int[] Update(int[] data)
        {
            data = new []{10, 20, 30};
            return data;
        } 
     static void Main(string[] args)
        {
            var data = new[] {2, 4, 6};
            var p = new Program();

            Console.WriteLine(p.Update(data)[0]);//インスタンス化したクラスを読みにいってるので、10が出てくるはず
            Console.WriteLine(data[0]);//丸ごと配列が入れ替わり、メモリ番地が切り替わっているため、Main内の配列番号０が参照される。
            
        }
    }
}
```

出力は以下となります。

```
-------------------------------------------------------------------
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.
-------------------------------------------------------------------
10
2

```

#値型の参照渡し
参照渡しは、値のコピーではなく、値が格納されている変数領域への参照情報（例えるなら、リンク）を渡します。仮引数にrefを付与するだけで、この設定ができます。ref付仮引数に値を代入すると、呼び出し元の変数に値が代入されます。

```C#
using System;

namespace data_refarence
{
    class Program
    {
        public int CountUp(ref int data){
            data++;
            return data;
        }
        static void Main(string[] args)
        {
            var data = 1;
            var p = new Program();
            Console.WriteLine(p.CountUp(ref data));//このrefは、参照先を示しており、インスタンス化されたクラスの実行により、Mainクラスのdataが、参照され、インクリメントされ、２を返すはず
            Console.WriteLine(data);//上の説明文から、Main内のdataがインクリメントされたままで値が出力されるため、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.
-------------------------------------------------------------------
2
2
```

#あとがき
さて、書籍も半分を通過して、だんだんプログラムに触れていく機会が増えていきました！
最近はPHPにも浮気し始めましたが・・・
作って見たい内容のためにもう少し頑張っていきたいと思います！