Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

C#  値型・参照型、値渡し・参照渡し

次のサブクラスに対し、

using UnityEngine;
using System.Collections;
//Sub Class
public class Sub : MonoBehaviour {
	public int a;	
}

次のメインクラスがあるとする。

using UnityEngine;
using System.Collections;
//Main Class
public class Main : MonoBehaviour {
	// Use this for initialization
	void Start () {
		Sub sub1 = GetComponent<Sub>();
		sub1.a = 1;
		Sub sub2 = sub1;
		sub2.a = 2;
		Debug.Log("sub1.a="+sub1.a);
		Debug.Log("sub2.a="+sub2.a);
	}
}

これを実行すると次のようになる。

sub1.a=2
UnityEngine.Debug:Log(Object)
sub2.a=2
UnityEngine.Debug:Log(Object)

すなわち、クラスは参照型のため、 sub2はsub1と同じ実体を指す。

では次はどうなるだろうか。

using UnityEngine;
using System.Collections;
//Main Class
public class Main : MonoBehaviour {

	// Use this for initialization
	void Start () {
		Sub sub1 = GetComponent<Sub>();
		sub1.a = 3;
		Sub sub2 = Proc (sub1);
		Debug.Log("sub1.a="+sub1.a);
		Debug.Log("sub2.a="+sub2.a);
		sub2.a = 5;
        Debug.Log("sub1.a="+sub1.a);
	}
	
	Sub Proc(Sub sub){
		sub.a = 4;
		return sub;
	}
}

この出力は次の通り。

sub1.a=4
UnityEngine.Debug:Log(Object)
sub2.a=4
UnityEngine.Debug:Log(Object)
sub2.a=5
UnityEngine.Debug:Log(Object)

つまり、関数の引数にクラスを渡す場合は参照渡し。関数の中でクラスに加えた変更は呼び出し側にも反映される。