ref / out キーワード
ref キーワード・out キーワードの存在を忘れていた訳ではないんですが、久しぶりにコードの中で見つけて、どういった働きをしていたか忘れてしまっていたので、MSDNを見ながらコードを書いてみた。
ref コード
参照渡し。
using System; class Program { static void refChange( ref bool flag ) { flag = true; } static void Change( bool flag ) { flag = true; } static void Main() { bool a = false; bool b = false; refChange( ref a ); Change( b ); Console.WriteLine( a.ToString() ); Console.WriteLine( b.ToString() ); } }
ref 実行結果
inohiro-mac:ref_and_out inohiro$ mono Ref2.exe True False
ref キーワードなしで渡して、「変わってると思った値が変わってない」とか普通にやりそうなミスで怖い。気をつけないと。
out コード
out はコンパイラから見るとrefと同じように見えるようだが、値の入ってないオブジェクト(初期化してないオブジェクト)を渡せる。なので初期化するメソッドとか呼ぶと、戻り値(というよりは「副作用」と言うべきか?*1)として3つのオブジェクトに値が代入される。
using System; class Program { static void SetDefaultVal( out string arg1, out string arg2, out string arg3 ) { arg1 = "hello"; arg2 = "world"; arg3 = "ACAC"; } static void Main() { string a, b, c; SetDefaultVal( out a, out b, out c ); Console.WriteLine( "{0}, {1}! by {2}", a, b, c ); } }
out 実行結果
inohiro-mac:ref_and_out inohiro$ mono Ref3.exe hello, world! by ACAC
ううむ
あんまりこんな風に変数の値を変えたり、初期化したりするコードを書かないんですが、書くようにしてみるか。フラグのセットとかに使えますね。
*1:これを副作用と言っていいのかどうかは断言し難い。こういうのを副作用って言うんですよね?