我通过了一个全球性的' 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
}
}
}
答案 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";
}
}
}