为什么我传递的对象被编辑

本文关键字:对象 编辑 为什么 | 更新日期: 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";
        }
    }
}