yoshikazuendo
4/9/2014 - 8:58 AM

【C#】refキーワードで参照型を参照渡しした時の挙動に関して

【C#】refキーワードで参照型を参照渡しした時の挙動に関して

class RefTest
{
	public void MainMethod()
	{
		RefTestClass a = new RefTestClass();
		a.VAL = "test";

		test(ref a);
		Console.WriteLine(a.VAL); // vvalvalnew が返ってくる。 

		test2(a);
		Console.WriteLine(a.VAL); // valval2 が返ってくる。 
	}

	/// <summary>
	/// ref付き参照型渡し 
	/// 参照する場所を変更できる。 
	/// </summary>
	/// <param name="val"></param>
	private static void test(ref RefTestClass val)
	{
		val.VAL = "valval"; // コール元メソッドから見て、この処理は有効 
		val = new RefTestClass(); // 参照する場所を変更した、と同等の処理 
		val.VAL = "valvalnew"; // コール元メソッドから見て、この処理は有効! 
	}

	/// <summary>
	/// ref無し参照型渡し 
	/// 参照する場所を変更できない。 
	/// </summary>
	/// <param name="val"></param>
	private static void test2(RefTestClass val)
	{
		val.VAL = "valval2"; // コール元メソッドから見て、この処理は有効 
		val = new RefTestClass(); // newはしたが、このメソッド内だけのスコープ(返らない) 
		val.VAL = "valval2new"; // コール元メソッドから見て、この処理は無効 
	}
}

public class RefTestClass
{
	public string VAL { get; set; }
}