C#新对象但不是复制对象,而是引用?

时间:2011-04-24 21:32:14

标签: c#

我有一个班级说ClassA,里面有一个字符串数组。

在我的代码中,我将ClassA作为对象,然后我想创建另一个新的ClassA对象,但它应该将原始对象复制到新类并执行它应该做的任何事情。

但奇怪的是,当我声明新对象时,新对象中的任何更改都会影响原始对象。

我有什么理由得到这样的行为吗?

5 个答案:

答案 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;
............