0.0 はじめに
List(リスト)を別のListにコピーしたいとき、=(イコール)を使って単純にリストを代入すると参照渡しになってしまうので注意が必要です。
1.0 参照渡し
参照渡しとは、コピー先でも同じListを参照するように渡すことです。 コピーされたListに変更を加えると元のリストにも変更が反映されます。
シャローコピー(Shallow Copy : 浅いコピー)とも言います。
C# Test.cs
List<string> listA = new List<string> {"test"};
// listAの要素を変えるとlistBも一緒に変わる
List<string> listB = listA;
2.0 値渡し
上記に対して値のみを渡すのが値渡しです。変更がコピー元に影響しません。
値渡しの方法はいろいろありますが、シンプルなのはListのコンストラクタを使う方法だと思います。
ディープコピー(Deep Copy : 深いコピー)とも言います。
C# Test.cs
List<string> listA = new List<string> {"test"};
// listAを変えてもlistBは変わらない
List listB = new List(listA);
3.0 まとめ
試してみた。
C# Test.cs
// Listのコピーのテスト
public class Test : MonoBehaviour
{
// List作成、List Aには0,1,2を入れている
List<int> listA = new List<int> {0,1,2};
List<int> listB = new List<int>();
List<int> listC = new List<int>();
private void Start() {
listB = listA; // 参照渡しでコピー
listC = new List<int>(listA); // 値渡しでコピー
// 初期値を表示
ListCheck(listA, "listA"); // 0,1,2
ListCheck(listB, "listB"); // 0,1,2
ListCheck(listC, "listC"); // 0,1,2
// list Aに99を追加
listA.Add(99);
// 現在値を表示
ListCheck(listA, "listA"); // 0,1,2,99
ListCheck(listB, "listB"); // 0,1,2,99(99が追加された)
ListCheck(listC, "listC"); // 0,1,2
// list Bから1を削除
listB.Remove(1);
// 現在値を表示
ListCheck(listA, "listA"); // 0,2,99(1が削除された)
ListCheck(listB, "listB"); // 0,2,99
ListCheck(listC, "listC"); // 0,1,2
}
// コンソール画面に表示するために作ったメソッド
void ListCheck(List<int> list, string listName) {
string str = "";
foreach (var item in list) {
str += item.ToString() + ", ";
}
Debug.Log($"{listName} の中身は {str} です");
}
}