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();
...