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

C#新对象,但不是复制对象,而是引用?,c#,C#,我有一个类,比如ClassA,在类中有一个字符串数组 在我的代码中,我将ClassA作为一个对象,然后我想创建另一个新的ClassA对象,但它应该将原始对象复制到新类中,并执行它应该执行的任何操作 但奇怪的是,当我声明新对象时,新对象中的任何更改都会影响原始对象 有什么原因让我有这样的行为吗?看来你已经把第一个对象分配给了第二个 要复制现有对象,必须将其所有属性值指定给新对象,而不是指定整个对象,因为这样可以创建对同一对象的另一个引用 要创建ClassA的第一个实例的副本,请尝试以下操作: Cl

我有一个类,比如ClassA,在类中有一个字符串数组

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

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


有什么原因让我有这样的行为吗?

看来你已经把第一个对象分配给了第二个

要复制现有对象,必须将其所有属性值指定给新对象,而不是指定整个对象,因为这样可以创建对同一对象的另一个引用

要创建
ClassA
的第一个实例的副本,请尝试以下操作:

ClassA = secondObject = new ClassA();
secondObject.Property1 = firstObject.Property1;
secondObject.Property2 = firstObject.Property2;
............

我确信这是因为您只是在新对象中设置对一个字符串数组的另一个引用。如果你想要一个单独的字符串数组,你需要创建一个构造函数来创建一个新的字符串数组并复制字符串。

你可以创建一个构造函数重载来获取一个新的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);
这是因为class-是一种引用类型,您试图获得值类型的行为。请参阅更深入的解释。此外,J.Richter的C#book在CLR中对其进行了详细解释


如果要复制引用类型,可能需要实现一个接口并为此调用Clone。

听起来您只是在复制它:

ClassA obj2 = obj1;
在这种情况下,对
obj2
的更改实际上会反映在
obj1
中,因为您使用的对象只是指向内存堆中相同位置的指针。你不是在复制它,你只是在引用它

查看
ICloneable
界面。你会想要这样的东西:

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();
ClassA obj2 = obj1.Clone<ClassA>();
那么你可以这样称呼它:

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();
ClassA obj2 = obj1.Clone<ClassA>();
但是,请记住,这不是非常安全的类型。那个演员阵容有点混乱(老实说,我还没试过,所以可能会有问题)。我认为.NET还没有引入通用的
iClonable
。但写一本应该不会太难。比如:

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;
    }
}
SomeOtherClass obj3 = obj1.Clone<SomeOtherClass>();
创建这样的泛型接口的另一个好处是,任何给定的类都可以“克隆”到其他类型,而不仅仅是它本身。您可以在单个类上实现任意多个
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;
    }
}
SomeOtherClass obj3 = obj1.Clone<SomeOtherClass>();
SomeOtherClass obj3=obj1.Clone();

这完全是我的想法,我手头没有一个编译器来测试它,但你明白了。

用你正在使用的代码编辑你的问题(包括你的
ClassA
定义的相关部分)。正如@Michael所说,如果没有一些代码,我们无法确定,但你可能在做浅拷贝,而不是深拷贝。如果你从未听说过这些术语,请用谷歌搜索。请发布一些代码。没有它,这有点像猜谜游戏。