自定义类数组一次将值设置为两个元素

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&lt;Scores&gt; 来代替?

[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);
    

【讨论】:

以上是关于自定义类数组一次将值设置为两个元素的主要内容,如果未能解决你的问题,请参考以下文章

C++ 运算符重载四(自定义数组类)

怎么用new定义一个类数组,并且释放内存

在Angular中的ngClass中绑定自定义类

js中一个自定义数组的问题

自定义类的数组作为属性

将返回的 Observables 转换为角度的自定义类数组