C#复制实例并修改新实例,而以前的实例没有改变

本文关键字:实例 改变 复制 修改 新实例 | 更新日期: 2023-09-27 18:21:35

我在基于现有实例创建对象的新实例时遇到了这样的问题。

为了更好地解释我想做什么——想象一下我有一个实例要传递给函数,我想将这个现有实例的内容复制到另一个实例,并向这个新实例添加更多内容(但重要的是,第一个实例根本不会更改)。

因此,第一个实例被"冻结",新实例被克隆和修改。

我所做的是模型:

public class Scenario
{
    public List<SingleMove> listOfMoves { get; set; }
    public List<int> listOfScores { get; set; }
    public int totalScore { get; set; }
    public Scenario(Scenario currentScenario)
    {
        listOfMoves = currentScenario.listOfMoves;
        listOfScores = currentScenario.listOfScores;
        totalScore = currentScenario.totalScore;
    }
...

以及现在正在对这些对象进行操作的功能

    static public void ActivitiesForMoveWhites(Scenario currentScenario, int positionTo, int positionFrom)
    {
        Scenario singleScenario = new Scenario(currentScenario);
        SingleMove singleMove = new SingleMove();
        singleMove.checker = Configuration.chessfield[positionFrom];
        singleMove.positionFrom = Logic.TranslateNumberOfFieldToString(positionFrom); //tutaj moze przechowywac to jako position czyli w intcie ?
        singleMove.positionTo = Logic.TranslateNumberOfFieldToString(positionTo); //tutaj moze przechowywac to jako position czyli w intcie ?
        singleScenario.listOfMoves.Add(singleMove);
        Configuration.listOfScenarios.Add(singleScenario);
        //Configuration.listOfScenarios.Add(new Scenario(singleScenario));
...

问题是,所有不同的场景都有相同的移动列表。但不应该是这样。当前场景应该已经复制了以前的场景内容,添加了一些内容,并且从中复制内容的场景应该保持原样。所以最后我有了不同listOfMoves的场景,不一样!

抱歉,解释有点混乱。如果您有问题或需要更多详细信息,请询问。

编辑:还有一个问题,但我解决了。

C#复制实例并修改新实例,而以前的实例没有改变

您还必须克隆场景中的列表,因为=不会创建列表的新实例。在你的构造函数中尝试这样的东西:

listOfMoves  = new List<SingleMove>(currentScenario.listOfMoves.Select(x => (SingleMove)x.Clone()));

编辑:

您必须在SingleMove对象中实现IClonable