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

时间:2016-02-05 15:28:29

标签: c#

我通过了一个全球性的' object作为方法的参数。然后我初始化一个对象的新实例并将其设置为等于原始实例,在我脑海中我现在有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
    }
    }
}

3 个答案:

答案 0 :(得分:3)

您没有初始化新对象。您只是在这里复制对原始引用的引用:

myObjectClass newObject = myObjectInstance;

您的问题不一定是一个干净的解决方案。根据您的类/对象的外观,您可以使用MemberwiseClone。但由于这是一个受保护的方法,你必须在myObjectClass上公开它,如下所示:

public myObjectClass ShallowCopy()
{
   return (myObjectClass) this.MemberwiseClone();
}

然后在myClass中调用它:

myObjectClass newObject = myObjectInstance.ShallowCopy();

这会使您的对象的浅层副本可能会或可能不会完成您想要的任务。来自docs

  

MemberwiseClone方法通过创建新的方法来创建浅表副本   对象,然后将当前对象的非静态字段复制到   新的对象。如果一个字段是一个值类型,那么就是一个逐位的副本   字段执行。如果字段是引用类型,则引用为   复制但引用的对象不是;因此,原始对象   它的克隆引用同一个对象。

如果这还不够,那么您可能必须实现克隆方法来执行深层复制。如何做到这一点也在上述文档中有详细说明。

答案 1 :(得分:1)

RemoteConfigMgr类是一种引用类型,这意味着此类型的每个变量都只是对实际对象的引用(地址)。这一行:

myObjectClass newObject = myObjectInstance;

表示newObject变量现在将引用与myObjectInstance变量相同的对象。因此,当您修改newObject时,您还要修改myObjectInstance。

答案 2 :(得分:0)

您正在复制对该问题的对象的引用。 要创建具有相同属性的另一个对象,可以使用MemberwiseClone

public class GlobalObject
{
    public GlobalObject GetCopy()
    {
        return (GlobalObject)MemberwiseClone();
    }
}

但你必须了解difference between ShallowCopy and 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";
        }
    }
}