C# 多字段';当一个字段';s值已更改

C# 多字段';当一个字段';s值已更改,c#,field,C#,Field,我有以下代码: public GameMenu(Scene startScene) { this.StartSceneBackup = startScene; this.StartSceneBackup.Entities[0].X = 200; this.StartScene = startScene; } 从未接触StartSceneBackup变量,仅访问StartScene变量,但是当我通过this.StartSceneBackup.Entities[0]更改X

我有以下代码:

public GameMenu(Scene startScene)
{
    this.StartSceneBackup = startScene;
    this.StartSceneBackup.Entities[0].X = 200;

    this.StartScene = startScene;
}
从未接触StartSceneBackup变量,仅访问StartScene变量,但是当我通过
this.StartSceneBackup.Entities[0]更改X的值时,X=200
它更改
this.StartScene.Entities[0]的值。X=200


这是为什么?

因为场景是一个引用类型,StartSceneBackup和StartSceneBackup指向同一个对象。 关于引用类型ref

编辑

如果您想保存备份副本,您应该了解浅克隆和深克隆,对于引用类型,您必须使用深克隆,您可以像这样在场景类中实现IClonable接口

public class Scene : ICloneable
{
    /// your codes

    public object Clone()
    {
        // it is DEEP CLONE
        using (var stream = new MemoryStream())
        {
            var formatter = new BinaryFormatter();
            formatter.Serialize(stream, this);
            stream.Position = 0;
            return (Scene)formatter.Deserialize(stream);
        }
    }
}

public GameMenu(Scene startScene)
{
this.StartSceneBackup = startScene.Clone();
...