对于将一个对象复制到另一个对象中的这两种方法,我有点陌生。我很困惑,也找不出深拷贝和浅拷贝的主要区别。我在这方面经历了很多理论,但我需要用适当的例子来解释。我有将一个对象复制到另一个对象中的程序。-->
class A
{
public int a = 0;
public void display()
{
Console.WriteLine("The value of a is " + a);
}
}
class Program
{
static void Main(string[] args)
{
A ob1 = new A();
ob1.a = 10;
ob1.display();
A ob2 = new A();
ob2 = ob1;
ob2.display();
Console.Read();
}
}
这是浅拷贝还是深拷贝?有谁能给我一个合理的答案。如果它是一个深拷贝,那么请为这个程序提供浅层拷贝的代码,这个程序做同样的对象复制工作,而反过来。
如果以上是浅拷贝,那么即使这也应该是浅拷贝->
A ob1 = new A();
ob1.a = 10;
ob1.display();
A ob2 = ob1;
ob2.a = 444;
ob1.display();
发布于 2013-08-05 19:48:14
从链接这里
浅层复制尽可能少。集合的浅副本是集合结构的副本,而不是元素的副本。对于浅拷贝,两个集合现在共享各个元素。 深拷贝复制了一切。一个集合的深层副本是两个集合,其原始集合中的所有元素都被复制。
您的示例是创建一个浅副本。
A ob1 = new A();
ob1.a = 10;
A ob2 = new A();
ob2 = ob1;
ob1.a = 5; // <-- If you see value of ob2.a after this line, it will be 5.
深印本将是-
A ob1 = new A();
ob1.a = 10;
A ob2 = new A();
ob2.a = ob1.a;
ob1.a = 5; // <-- If you see value of ob2.a after this line, it will be 10.
发布于 2016-10-07 12:40:05
这既不是浅的,也不是深的,这是一个引用copy.let我解释:有两种类型的变量:值类型和引用类型。
值类型是计算机内存中保存变量实际值的(命名)位置。例如: int是一个值类型,所以当您编写这一行代码时:
int MyInt = 5;
当执行这一行代码时,运行时将在RAM中找到一个位置,并在其中写入值5。所以,如果你搜索那个位置,你会发现一个实际值为5。
引用类型-in对比度-是内存中的一个(命名的)位置,它不实际保存变量的值,而是保存存在该值的内存位置。例如,假设您编写了以下代码:
MyClass myObject = new MyClass();
所发生的是虚拟机(运行时):1-查找并找到内存中的可用位置,创建MyClass类的一个实例。假设该对象的位置恰好位于内存中的字节# AA3D2。
2-在内存中找到一个位置并创建一个MyClass类型的引用(引用是指向内存中某个位置的“箭头”),将其命名为"myObject“并在其中存储值AA3D2。
现在,如果您查看"myObject“变量,您会发现它不是类实例,而是AA3D2,它表示持有该类实例的内存的位置。
现在,让我们检查给我的OP的代码:
A ob1 = new A();
这将生成一个名为ob1的变量,创建A类的实例,并将该类的位置存储在ob1中
ob1.a = 10;
ob1.display();
这将改变A类中的变量a。然后调用display()方法。
A ob2 = new A();
在这里,它创建一个名为ob2的变量,创建类A的一个实例,并将其位置分配给ob2。
到目前为止,您在内存中有两个A类实例和两个变量,每个都指向其中一个变量。下面是有趣的部分: ob2 = ob1;
变量ob2被指定为变量ob1的值。因为ob1包含A的第一个实例的内存位置,所以现在ob1和ob2都指向内存中的相同位置。使用其中之一做任何事情都完全是在对另一个做同样的事情。
ob2 = ob1意味着要复制引用。
发布于 2013-08-05 19:48:54
这是一个浅拷贝,因为如果您修改ob2的变量--然后尝试打印ob1 --它们将是相同的。这是因为C#中的类创建了它们之间的链接。如果要执行深度复制,则应实现复制方法并手动复制字段。类似于:
class A
{
public int a = 0;
public void display()
{
Console.WriteLine("The value of a is " + a);
}
public A Copy()
{
A a = new A();
a.a = = this.a;
return a;
}
}
https://stackoverflow.com/questions/18066429
复制相似问题