2016-02-05 69 views
0

我将一个'全局'对象作为参数传递给一个方法。然后我初始化一个新的对象实例,并将其设置为等于原始对象,在我的脑海中,我现在拥有该对象的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 
    } 
    } 
} 
+0

myObjectClass NEWOBJECT = myObjectInstance;为myObjectInstance设置一个引用。试试[ReferenceEquals](https://www.google.de/webhp?sourceid = chrome-instant&ion = 1&espv = 2&ie = UTF-8#q = c%23 + ReferenceEquals)函数,如果两个对象在内存中为同一对象 –

+1

,则返回true,因为它的参考副本不是浅的或深度复制 – Szer

+0

这就是Value-和ReferenceTypes之间的区别... –

回答

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"; 
     } 
    } 
} 
+0

是的,你必须理解答案的定义。没有一个字的问题为什么... – TomTom

+0

@TomTom这是一个工具。它取决于你如何以及为什么使用它。 – Szer

+0

是的,Ignorane表明。试着读他的问题。他要求解释,而不是工作。 – TomTom

3

您未初始化新对象。你只是在这里复制一个原始的参考:

myObjectClass newObject = myObjectInstance; 

这不一定是一个干净的解决方案,您的问题。根据您的类/对象的外观,您可以使用MemberwiseClone。但由于这是一个受保护的方法,你必须将其暴露在myObjectClass像这样:

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

然后调用它MyClass中:

myObjectClass newObject = myObjectInstance.ShallowCopy(); 

这将使的浅表副本你对象可能会或可能不会完成你想要的。从docs

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

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

+0

thx,你能完成你的代码解决方案吗? – Fearghal

+0

无处不在使用受保护的MemberwiseClone方法。 – Szer

+0

你是对的。他将不得不为课程添加一个方法! –

1

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

myObjectClass newObject = myObjectInstance;

意味着newObject变量现在将引用与myObjectInstance变量相同的对象。所以当你修改newObject时,你也在修改myObjectInstance。

+0

你知道我将如何解决? – Fearghal

相关问题