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

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

メソッドの参照について

みなさんこんにちは🌞

ずいぶん久しぶりの更新になりますブルーノです。夏も終わりを迎えつつあり日も短くなってきましたね。私は夏よりも冬の方が温度的には好きなんですが日が短いと大好きなテニスをする時間も少なってしまうんですよね(´;Д;`)

 

さて今回は、メソッドに渡した引数、パラメータについてです。私がこれまで練習してきた引数を扱うメソッドは主に、呼び出した引数を加工するものでした。

例)

int x, y;

....

 

p.method (x, y); 

 この時、メソッドがxやyの値を変更したとして、そのクラス内でその変更された値を使おうとしても呼び出したxやyの値を変更することはできません。例として、下の画像のようになります。

f:id:covory10101101276:20170913220704p:plain

f:id:covory10101101276:20170913220716p:plain

これは、メソッドで普通に値を呼び出した場合、そのまま値が渡されるのではなく、そのコピーが渡されているからです。この方法は値渡しと呼ばれています。以前、値型と参照型についてやりましたが、これとは別物であることに注意が必要です。別に参照型の値を渡しても(ex. string型)値渡しと呼ぶので気をつけましょう。

 

では一方で、引数そのものを加工したい時はどうすれば良いのでしょうか。この場合は、引数の前にrefキーワードをつけて呼び出します。

例)p.method (ref x, ref y);

例として、さっきのプログラムに付け足して以下のようになります。

f:id:covory10101101276:20170913220905p:plain

f:id:covory10101101276:20170913220915p:plain

この場合、呼び出し元の値を加工することで呼び出し側の値を変更することができます。一つ注意すべきことは、メソッドのパラメータリストだけでなく、呼び出し側にもrefキーワードをつけなければならないことです(上の画像でいう5行めと19行め)。これを怠ると、バグが発生してしまう恐れがあります。

 

さて、これで呼び出し側の値も変更できることがわかりましたが、ここで2点refキーワードについて特筆することがあります。それは

・呼び出し側を初期化しておく必要がある

・メソッド内で値を代入しなくてもコンパイルエラーにならない

ということです。前者は初期化した値に意味がなくても初期化しておかなくてはならない、後者はメソッド内で代入を忘れてしまっても気付けないというデメリットがあります。それをなくすために今度はoutキーワードというものを使います。先の例のプログラムで表すと以下のようになります。

f:id:covory10101101276:20170913230434p:plain

f:id:covory10101101276:20170913230441p:plain

先の例ではメソッド内で代入をすることがないためこのoutキーワードは使えなかったので、中身を代入するものに変えてみました。それ以外でさっきと違うのは13, 14行めにあるようにaやbを初期化せず、そのまま使用していることです。outキーワードの特徴としてはさっきのrefキーワードと対比させて書き表すと

・引数を初期化しなくても良い

・メソッド内で必ず値を代入しなくてはならない

ということがわかります。今回はこの3つの引数の渡し方について説明したところで終わります。

 

今年のテニスのUSオープンもすごい試合がたくさんありましたね。ナダルが優勝したのはナダルファンとしてはとても嬉しかったです。もう一つ目を見張ったのはフェデラーとデルポトロの試合ですね。デルポトロのサーブやらストロークやら強すぎて勝てる人はいないんじゃないかと思ってしまうくらいでした。

長い間更新をサボっていましたが、またどんどん勉強成果を載せていきます(別に更新していないからって全く勉強していないわけではないですよ....?)。