为什么我的传递对象被编辑
我将一个'全局'对象作为参数传递给一个方法。然后我初始化一个新的对象实例,并将其设置为等于原始对象,在我的脑海中,我现在拥有该对象的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
}
}
}
您正在复制对象的引用这就是问题所在。 要创建具有相同属性的另一个对象,你可以使用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";
}
}
}
您未初始化新对象。你只是在这里复制一个原始的参考:
myObjectClass newObject = myObjectInstance;
这不一定是一个干净的解决方案,您的问题。根据您的类/对象的外观,您可以使用MemberwiseClone。但由于这是一个受保护的方法,你必须将其暴露在myObjectClass像这样:
public myObjectClass ShallowCopy()
{
return (myObjectClass) this.MemberwiseClone();
}
然后调用它MyClass中:
myObjectClass newObject = myObjectInstance.ShallowCopy();
这将使的浅表副本你对象可能会或可能不会完成你想要的。从docs:
的MemberwiseClone方法创建一个新的 对象,然后复制当前对象的非静态字段 新对象创建一个浅表副本。如果字段是值类型,则执行 字段的逐位副本。如果一个字段是一个引用类型,那么引用是 复制但引用的对象不是;因此,原始对象 及其克隆涉及相同的对象。
如果这还不够,那么您可能必须实施克隆方法来执行深层复制。上述文档中还详细说明了如何做到这一点。
RemoteConfigMgr类是一个引用类型,这意味着此类型的每个变量都只是对实际对象的引用(地址)。该行:
myObjectClass newObject = myObjectInstance;
意味着newObject变量现在将引用与myObjectInstance变量相同的对象。所以当你修改newObject时,你也在修改myObjectInstance。
你知道我将如何解决? – Fearghal
myObjectClass NEWOBJECT = myObjectInstance;为myObjectInstance设置一个引用。试试[ReferenceEquals](https://www.google.de/webhp?sourceid = chrome-instant&ion = 1&espv = 2&ie = UTF-8#q = c%23 + ReferenceEquals)函数,如果两个对象在内存中为同一对象 –
,则返回true,因为它的参考副本不是浅的或深度复制 – Szer
这就是Value-和ReferenceTypes之间的区别... –