inohilog

/var/log/inohiro.log

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:これを副作用と言っていいのかどうかは断言し難い。こういうのを副作用って言うんですよね?