【发布时间】:2018-10-28 16:07:52
【问题描述】:
我正在寻找一种跳过 C# 中的复制构造函数方法的好方法,并寻找一种在下面的代码中通过赋值来做同样事情的方法:
class Person
{
string Name;
int Age;
public Person() { }
//public Person(Person p)//copy contructor
//{
// this.Name = p.Name;
// this.Age = p.Age;
//}
public Person(string name ,int age)
{
this.Name = name;
this.Age = age;
}
public void Set(string name,int age)
{
this.Name = name;
this.Age = age;
}
public void Get()
{
Console.WriteLine("{0} {1}",Name,Age);
}
};
Person person= new Person("Arif",40);
person.Get();
//Person person2 = new Person(person);//skip copy
Person person2 = new Person();
person2 = person;//use assignment
person2.Get();
person.Set("Mahmood",44);
person.Get();
person2.Get();
复制构造函数实现时我看到的输出是下面给出的输出
Arif 40
Arif 40
Mahmood 44
Arif 40
但是我看到的分配输出是错误的,下面给出了一个
Arif 40
Arif 40
Mahmood 44
Mahmood 44
如何获得正确的输出?
【问题讨论】:
-
您可以尝试在 C# 中编写 C++,但您真的不应该这样做。我们不做复制构造函数,你不能覆盖赋值。
-
本质上 person 和 person2 指向同一个地方,如果要克隆对象,那就是另一回事了
-
Java 和 C# 与 C++ 的不同之处在于它们不会在赋值时进行深度克隆(即调用复制构造函数)。他们只是分配浅层引用。
-
您确定这是一个真正的问题吗?
Person是具有强身份的域实体,应尽量避免克隆。