为什么我传递的对象被编辑
本文关键字:对象 编辑 为什么 | 更新日期: 2023-09-27 18:33:20
我将一个'全局'对象作为参数传递给方法。然后,我初始化该对象的新实例并将其设置为与原始实例相等,在我的脑海中,我现在有该对象的 2 个实例。
为什么当我更改第二个实例时,第一个实例会更改?我从未使用过"ref"。
namespace myNamespace
{
public class myClass
{
private myObjectClass myGlobalInstance;
public void myMethod()
{
doSomething(myGlobalObject);
}
private String doSomthing(myObjectClass myObjectInstance)
{
myObjectClass newObject = myObjectInstance;
newObject.variable1 = "boo"; //this seems to change both newObject.variable1 as required AND myObjectInstance.variable1 and its calling classes object
}
}
}
您没有初始化新对象。您只是在此处复制对原始引用的引用:
myObjectClass newObject = myObjectInstance;
您的问题不一定有干净的解决方案。根据您的类/对象的外观,您可以使用 MemberwiseClone。但是由于这是一个受保护的方法,你必须在myObjectClass上公开它,如下所示:
public myObjectClass ShallowCopy()
{
return (myObjectClass) this.MemberwiseClone();
}
然后在 myClass 中调用它:
myObjectClass newObject = myObjectInstance.ShallowCopy();
这将创建对象的浅层副本,该副本可能会也可能不会完成您想要的。从文档中:
MemberwiseClone 方法通过创建一个新的 对象,然后将当前对象的非静态字段复制到 新对象。如果字段是值类型,则 字段被执行。如果字段是引用类型,则引用为 复制但引用的对象未复制;因此,原始对象 它的克隆引用同一个对象。
如果这还不够,则可能必须实现克隆方法来执行深层复制。如何做到这一点也在上面的文档中详细说明。
RemoteConfigMgr 类是一种引用类型,这意味着这种类型的每个变量都只是对实际对象的引用(地址(。该行:
myObjectClass newObject = myObjectInstance;
意味着 newObject 变量现在将引用与 myObjectInstance 变量相同的对象。因此,当您修改 newObject 时,您也在修改 myObjectInstance。
您正在复制对对象的引用,这就是问题所在。要创建具有相同属性的另一个对象,您可以使用 MemberwiseClone:
public class GlobalObject
{
public GlobalObject GetCopy()
{
return (GlobalObject)MemberwiseClone();
}
}
但是你必须了解ShallowCopy和DeepCopy之间的区别。
您的代码将如下所示:
namespace myNamespace
{
public class myClass
{
private GlobalObject myGlobalInstance;
public void myMethod()
{
doSomthing(myGlobalObject);
}
private String doSomthing(GlobalObject myObjectInstance)
{
GlobalObject newObject = myObjectInstance.Copy();
newObject.variable1 = "boo";
}
}
}