ブルーノのC#プログラミング & unity勉強日記

プログラミング素人、ブルーノの自主勉強ノートです。他のプログラミングを勉強したい方の助けになれば幸いです。その他趣味の雑記もしていきたいです

値渡しと参照渡しの違いについて

f:id:covory10101101276:20171108190139j:plainみなさんこんにちは🌚

値渡しと参照渡しの違いがわからず、また値型と参照型を混同してしまって最近更新が遅れてしまっていたブルーノです。様々なサイトを駆けずり回ってようやく理解できたきがするのでここにノートとしてまとめておきます!

 

メソッドに値を加工してもらいたい時はメソッドのブランケット「()」にパラメータ(引数)を渡し、それを加工するのですがなんと渡すものやその方法によって結果が異なってくるのです。その違いが値渡しと参照渡しになります。

値渡しについて

この二つの名前のせいで翻弄され続けていましたがズバリ値渡しは、その値のコピーを渡すことです。主にint型やlong型などのプリミティブ型と呼ばれる関数を引数に渡す場合この値渡しになります。最初の方にやった「変数について」

変数について - ブルーノのC#プログラミング & unity勉強日記

という記事でも値型と参照型というキーワードが出てきましたがこれらデータ型とは別のものであり、値型だからと言って値渡しになるとは限らず、参照型の変数だからと言って参照渡しになるとは限らないのです。この重要な事項が関わってくるのがstring型で、これはデータ型は参照型ですが値渡しになるのです。良く使う型であるだけに注意が必要ですね。では何が値型になるのかというと、なんの補助もなくそのまま使う場合はオブジェクト以外のものがこの値渡しになります。

f:id:covory10101101276:20171108200146p:plain

f:id:covory10101101276:20171108200150p:plain

上の画像にあるようにint a = 6と宣言してint型の変数を一つ用意し、Ichitasuメソッドで1足してその値を返していますが結果は変わらず6のままです。これはIchitasuメソッドに渡された6とint aに格納されている6は別物だからです。Ichitasuメソッドに渡されたのはint aの値のコピーであり、要は13行めでIchitasu(6)と書いているも同然なのです。

オブジェクト以外って具体的になんだよと言いたくなると思いますが次の参照渡しでオブジェクトをまとめるのでそれ以外と覚えてください。

 

参照渡しについて

では参照渡しとはなんなのか、オブジェクトをメソッドに渡す際はこの参照渡しになるのですが、参照渡しはオブジェクトそのものを加工してもらいます。

f:id:covory10101101276:20171108202900p:plain

f:id:covory10101101276:20171108202904p:plain

 

12行めではint aしか書かれていないBruno063クラスをオブジェクト化しています。そしてBruno063クラスを加工するIchitasuメソッドが13~16行めに記述されています。このそして17行めでこのIchitasuメソッドに渡されたBruno063 b は加工されます。これはコピーではなく現物で行われます。つまり、クラスからオブジェクト化されたものは加工できるということになります。ですが同じクラス内でメソッドに渡して加工したい時もありますよね。いちいちオブジェクト化しなければならないのは面倒だ...そこで使えるのがref, outキーワードなんですね。refキーワードをつけた引数は参照渡しになるため、メソッドに渡されるのはコピーではなくそのものになるのです。

 

最後に

オブジェクトは参照渡しになるのでクラスから作られる=参照渡しと捉えて良いですが構造体の場合は値型でしたね。構造体も使いたい場合はstruct sのようにクラスのオブジェクト化の時と似た感じで使いますが構造体は値型であるため、メソッドに渡す際はrefキーワードをつけて参照呼び出しにする必要があります。この部分がこの一週間わからず悩んでいたところです。スッキリしたところで今回は終わります。

 

あー早くunityの方に取り掛かってアプリ開発にも着手しないともう時間がない...もう今の知識だけでスクリプト面は大丈夫なのだろうか....