我有一个班级说ClassA,里面有一个字符串数组。
在我的代码中,我将ClassA作为对象,然后我想创建另一个新的ClassA对象,但它应该将原始对象复制到新类并执行它应该做的任何事情。
但奇怪的是,当我声明新对象时,新对象中的任何更改都会影响原始对象。
我有什么理由得到这样的行为吗?
答案 0 :(得分:2)
我确定这是因为你只是在新对象中设置另一个字符串数组的引用。如果你想要一个单独的字符串数组,你需要创建一个构造函数来创建一个新的字符串数组并复制字符串。
答案 1 :(得分:2)
您可以创建一个构造函数重载,它接受一个新的ClassA对象并复制它的参数。
public class ClassA
{
public String SomeParam { get; set; }
public ClassA(ClassA myoldobject)
{
//Logic for initializing new object.
this.SomeParam = myoldobject.SomeParam;
}
public ClassA(String someparam)
{
this.SomeParam = someparam;
}
}
这可以让你说
ClassA one = new ClassA("Test");
ClassA two = new ClassA(one);
答案 2 :(得分:2)
听起来你只是这样做来复制它:
ClassA obj2 = obj1;
在这种情况下,对obj2
的更改确实会反映在obj1
中,因为您使用的对象只是指向内存堆中相同位置的指针。你实际上并没有复制它,你只是在另外引用它。
查看ICloneable
界面here。你想要这样的东西:
public class ClassA : ICloneable
{
public string myString { get; set; }
public object Clone()
{
var obj = new ClassA();
obj.myString = myString;
return myObj;
}
}
然后你会这样称呼它:
ClassA obj2 = (ClassA)obj1.Clone();
请记住,这不是非常类型安全的。演员阵容有点混乱(老实说,我没有尝试过,所以它甚至可能有问题)。我不认为.NET已经引入了通用ICloneable
。但写一个不应该太难。类似的东西:
public interface ICloneable<T>
{
public T Clone();
}
public class ClassA : ICloneable<ClassA>
{
public string myString { get; set; }
public ClassA Clone()
{
var obj = new ClassA();
obj.myString = myString;
return myObj;
}
}
这应该可以这样调用:
ClassA obj2 = obj1.Clone<ClassA>();
或甚至可能(至少稍微调整一下):
ClassA obj2 = obj1.Clone();
制作这样的通用接口的另一个好处是,任何给定的类都可以“克隆”到其他类型,而不仅仅是自身。您可以在单个类上实现任意数量的ICloneable<T>
接口。所以你可以有类似的东西:
SomeOtherClass obj3 = obj1.Clone<SomeOtherClass>();
这一切都是我的头脑,我没有编译器方便测试它,但你明白了。
答案 3 :(得分:1)
这是因为 class - 是一种引用类型,您试图获取值类型的行为。请参阅更深入的解释here。此外,它在CLR中通过C#book by J. Richter进行了大量解释。
如果要复制引用类型,则可能需要实现IClonable接口并为此调用 Clone 。
答案 4 :(得分:0)
您似乎已将第一个对象分配给第二个对象..
要复制现有对象,您必须将其所有属性值分配给新对象,而不是分配整个对象,因为这样您可以创建对同一对象的另一个引用。
要创建ClassA
的第一个实例的副本,请尝试以下操作:
ClassA = secondObject = new ClassA();
secondObject.Property1 = firstObject.Property1;
secondObject.Property2 = firstObject.Property2;
............