初めに
C# の型には値型・参照型があります。本記事では、それらの特徴についてまとめます。
C# の型の分類
値型・参照型の違い
値型と参照型の違いは次の通りです。
型 | 特徴 | 例 |
---|---|---|
値型 | 型の値を直に保持する | int, bool など(stirng、object型以外) |
参照型 | 型の値の参照を保持する | string、object型 |
※値型はスタック(stack:堆積物、積み上げる)、参照型はヒープ(heap:塊、山積み)と呼ばれるメモリ領域に値を保存します。
違いがわかる具体例
//値型(intは値型) int num1 = 123; int num2 = num1; num1 = 456; Debug.Log(num1); //456 Debug.Log(num2); //123 //参照型(配列は参照型) int[] ref1 = new int[]{1, 2, 3}; int[] ref2 = ref1; ref1[0] = 4; Debug.Log(ref1[0]); //4 Debug.Log(ref2[0]); //4
値型の場合は、それぞれの値を直に保存します。そのため、num1、num2 それぞれに値を保存しています。num2 を定義するときに num1 の値を代入しただけで、その後、num1 の値が変化しても num2 の値は変化しません。
参照型の場合は、参照を保持します。つまり、ref2 は ref1 と同じ参照先を保持するとしています。そのため、ref1[0] を変更すると、参照先であるヒープに保存された値が変化し、ref1 も ref2 も値が変化します。
使い分け
クラスと構造体は意識して使い分けることがあるようです。通常はデータのサイズが小さく継承が必要ない場合は値型である構造体を使い、それ以外の場合は参照型であるクラスを使います。