自定义类数组一次将值设置为两个元素
Posted
技术标签:
【中文标题】自定义类数组一次将值设置为两个元素【英文标题】:Custom Class Array sets value to two elements at once 【发布时间】:2021-03-15 03:15:27 【问题描述】:我有一些 c# 统一代码,当我执行时无法正常工作。代码如下,应该创建一个包含 5 个分数类对象的数组,其中包含作为 int 的分数和作为字符串的玩家名称。
[SerializeField] Scores[] archeryScore = new Scores[5];
for (int i = 0; i < archeryScore.Length; i++)
archeryScore[i] = new Scores();
这是分数定义
[System.Serializable]
public class Scores
[SerializeField] private int score;
[SerializeField] private string name;
public int GetScore()
return score;
public string GetName()
return name;
public void SetScore(int newScore)
score = newScore;
public void SetName(string newName)
name = newName;
我正在使用私有变量和公共方法来设置值,但如果我尝试将名为 Dave 的元素 0 的分数设置为 3,它会将元素 0 和元素 1 设置为名为 Dave 的 3 分.
archeryScore[x].SetScore(score);
archeryScore[x].SetName(name);
archeryScore 只是一个 Score 类对象的数组 这是设置信息的代码,断点测试表明它同时设置了两个元素。
真正令人困惑的部分是,如果我将数组设置为整数数组,所有代码都可以正常工作。
Here's a link to the full game manager file pastebin
TIA
【问题讨论】:
请重新阅读您的问题并确保您包含的所有详细信息都确实存在。特别是“代码在下面,应该创建一个包含 5 个分数类对象的数组”暗示了一些创建对象但未显示的代码(请注意,问题必须包含调试问题的 minimal reproducible example 作为代码的文本表示 in问题本身,指向某些东西的链接很好,但不被视为问题的一部分) 请同时查看***.com/questions/347675/…,这可能是重复的,但如果问题中没有代码则很难说。 你确定archeryScore[0]
和archeryScore[1]
是不同的对象吗?
你想在你的 SetHighScore 方法中完成什么?因为我很确定它没有做你认为它在做的事情......我认为你在打算使用 continue
时使用了 break
并且对于看起来是随机播放的代码太多了?跨度>
【参考方案1】:
深入SetHighScore
你在做
archeryScore[x] = archeryScore[x - 1];
在这一行之后,这两个索引包含对 Scores
的同一个实例的引用 => 您更改了完全相同的对象!
您可能应该只复制相应的值。
我会为此使用专门的方法,例如
public class Scores
...
public void CopyFrom(Scores other)
this.name = other.name;
this.value = other.value;
然后做
archeryScore[x].CopyFrom(archeryScore[x - 1]);
但是请注意,这可能仍然没有达到您想要的效果。想象一下,通过那个循环,你总是复制最后一个条目的值。
因此,下次您再次迭代时,您将再次从最后一个条目复制 -> 但最后一个条目已经从之前的条目中复制了值 -> 最终都是一个相同的值。
所以为了让你的生活方式更轻松:
为什么不直接使用List<Scores>
来代替?
[SerializeField] private List<Scores> acheryScore = new List<Scores>();
您可以随时使用Insert
在某个索引处插入新的 HighScore,然后删除列表的最后一个条目。
首先我会使用一个合适的构造函数,比如
public class Scores
...
public Scores(string name, int score)
this.name = name;
this.score = score;
然后做
if (updateScore)
archeryScore.Insert(scoreToUpdate, new Score(name, score));
while(archeryScore.Count > 5)
archeryScore.RemoveAt(archeryScore.Count - 1);
【讨论】:
以上是关于自定义类数组一次将值设置为两个元素的主要内容,如果未能解决你的问题,请参考以下文章