C#

【C#】refキーワードの使い方・役に立つ場面

今回はC#のプログラムを書いているとたまに使うことがあるrefキーワードについて、使い方を解説します。

refキーワードの基本

refキーワードは参照渡しでオブジェクトを渡すためのキーワードです。と言っても良く意味が分からないと思うので使い方を見ていきましょう。

refキーワードを付けない場合、メソッド内で引数で渡されてきたデータを更新しても、呼び出し元のデータは変化しません。

それに対し、refキーワードを付ける場合、メソッド内で引数のデータを更新すると、呼び出し元のデータも変化します。

このようにrefキーワードを付けることでint、double等の値型の引数でも参照型引数として扱うことができます

refキーワードはどんな時に使うと役に立つのか

refキーワードは普段プログラムを書いていて使うことはあまりありません。使わなくてもプログラム書けるには書けますからね。。

でもプログラマーの私が使う場面をあげるなら、戻り値が必要なメソッドで引数のデータも更新したい場合です。↓

このプログラムの場合、TryUpdateメソッドではの戻り値でフラグを返していて第1引数のflagがtrueの場合のみ値更新しています。

このように戻り値が使えないが、引数を経由して呼び出し元⇔呼び出し先でデータの受け渡しを行いたい場合refキーワードが役に立ちます。

参照型にrefキーワードを付ける意味

intやdouble等の値型のデータに対しrefキーワードを付けることで、参照型データとしてメソッドへ渡せるようになることは理解できたと思います。

でもここで1つ疑問が浮かびます。class等の参照型のデータに対してrefキーワードを付けたらどうなるのでしょうか?

挙動が変わらないのではと思う方が多いと思いますが、refキーワードの有り無しで動きは変わります。次のコードを見てください。

Update1のメソッドではrefキーワード無しで、Update2のメソッドではrefキーワードを付けて引数のTestClassを渡しています。

出力結果に違いが出ているのが分かると思います。

refキーワードを付けない場合だと呼び出し元のオブジェクト自体の更新(newで新規オブジェクトを割り当て)はできませんが、refキーワードを付ければ呼び出し元のオブジェクト更新も行うことが可能です。

まとめ

今回はC#のrefキーワードについて解説しました。正直プログラムを書いていてもあまり使う機会は多くありませんが、覚えておくとプログラムを作る際や人のコードを読む際に役に立ちます。知らなかった人はぜひ覚えてくださいね。