読者です 読者をやめる 読者になる 読者になる

ぎばニャン怒りのデスマーチ

真の定時は23時だよぉ

【C#】値渡しと参照渡しの違い【メモ】

息抜きにプログラミングしてるときにうっかり値渡しと参照渡しを間違えて書いてしまい、バグが発生してしまいました…。

自戒のためにメモしときま~す。

 

値渡しと参照渡しってなんぞ

f:id:syama0520:20170318145612p:plain

私は値渡しを「かばんの中に入っているミカンをあげる」

  参照渡しを「ミカンが入っているかばんごとあげる」ってかんじでイメージしている。

よーするに、受け渡しの対象を「値」にするか「アドレス」にするかという話なんだよね。

プログラミングしたてのころはこれが本当にわからなくて困った。

 

実装例をあげるよ~

実装例いきましょ。

まずは扱うデータ元を用意するね。

  var kaban = new List<string>(){  

    "mikan1",

                "mikan2"

         };

 

「kaban」という文字列型のリストに、「mikan1」と「mikan2」が格納されてるよ。

 

●値渡し

 var valuePass = new List<string>(kaban);

 新しく定義した変数に対し、同じく新しいインスタンスを作って、初期値として「kaban」を格納した。

 

 ではデータ元を編集するとどうなるか。

 kaban.Add("mikan3");

 Console.WriteLine(kaban.Count());

    Console.WriteLine(valuePass.Count());

  ------------------------------------------------------------

  3

  2

 

 データ元と、渡した先の変数に格納されているものは全くの別物扱いになるので、データ元を編集しても、渡した先の変数には影響がないよ。

 

●参照渡し

 

●値渡し

 var refPass = kaban; 

 新しい変数を定義するけど、インスタンスは生成しないで「kaban」をそのままぶちこむよ。

 そしてさっきと同じくデータ元を編集してみると…

 

 kaban.Add("mikan3");

 Console.WriteLine(kaban.Count());

    Console.WriteLine(refPass.Count());

  ------------------------------------------------------------

  3

  3

 

データ元への編集は、参照渡しした先の変数にも反映されることになる。

 

値渡しと参照渡しは区別しとかないと痛い目を見る

今回はただの趣味プログラミング中に出たバグだったからよかったけど、仕事とかで値渡しと参照渡しをミスったら…と思うと玉ヒュン案件だよね。

データ元は編集したくなかったのに、間違えて上書きしてしまった!とか怖すぎる…

ビルドエラーが出るようなもんでもないからねえ。

来月から新年度になることだし、私みたいに文系卒で経験のないまま社会人プログラマーデビューする人は気をつけてね~。