public void ConvertMoves()
{
for (int i = 0; i < maxDirections; i++)
{
Debug.Log("gimme tsMoves "+tSpossibleMoves[i].Count + " from " + this);
possibleAttacks[i] = tSpossibleAttacks[i];
possibleAttacksInactive[i] = tSpossibleAttacksInactive[i];
possibleAttackIndicators[i] = tSpossibleAttackIndicators[i];
possibleMoves[i] = tSpossibleMoves[i];
Debug.Log("Gimme moves(1) " + possibleMoves[i].Count + " from " + this);
}
for (int i = 0; i < maxDirections; i++)
{
tSpossibleAttacks[i].Clear();
tSpossibleAttacksInactive[i].Clear();
tSpossibleAttackIndicators[i].Clear();
tSpossibleMoves[i].Clear();
Debug.Log("Gimme moves(2) " + possibleMoves[i].Count + " from " + this);
}
}
Run Code Online (Sandbox Code Playgroud)
所以调试日志报告以下内容:
gimme tsMoves 2来自JeanArc(克隆)(JeanArc)
Gimme移动(1)2来自JeanArc(克隆)(JeanArc)
一切都很好,但后来......
Gimme从JeanArc(克隆)(JeanArc)移动(2)0
为什么要清除整个不同List变量的移动?
这不会创建列表项的副本:
possibleAttacks[i] = tSpossibleAttacks[i]
Run Code Online (Sandbox Code Playgroud)
它简单地拷贝参考相同的对象到第二变量,所以possibleAttacks[i]和tSpossibleAttacks[i]现在都指向在存储器中的相同项目.可以想象有两张信用卡可以访问一个银行账户.
您可以在Microsoft的文档中阅读有关引用类型的更多信息.
正如Heinzi在下面的评论中指出的那样,你可以通过调用以下方式复制你的项目(因为它是一个列表):
possibleAttacks[i] = tSpossibleAttacks[i].ToList();
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果您只想分配tSpossibleAttacks[i]然后重置它,您也可以这样做:
possibleAttacks[i] = tSpossibleAttacks[i];
tSpossibleAttacks[i] = new List<your_type_name_here>(); // this will overwrite the reference held by `tSpossibleAttacks[i]`.
Run Code Online (Sandbox Code Playgroud)
请注意,如果列表包含引用类型,则列表中存在类似问题,例如:
public class Test
{
public string Name { get; set; }
}
List<Test> list1 = new List<Test>();
list1.Add(new Test() { Name = "John" });
List<Test> list2 = list1.ToList();
Console.WriteLine(list1[0].Name); // John
Console.WriteLine(list2[0].Name); // John
list2[0].Name = "Fred";
Console.WriteLine(list1[0].Name); // Fred
Console.WriteLine(list2[0].Name); // Fred
Run Code Online (Sandbox Code Playgroud)
因此,我建议您阅读值类型与引用类型以及引用如何在C#中工作.