首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >浅拷贝还是深拷贝?

浅拷贝还是深拷贝?
EN

Stack Overflow用户
提问于 2013-08-05 19:45:20
回答 5查看 61K关注 0票数 38

对于将一个对象复制到另一个对象中的这两种方法,我有点陌生。我很困惑,也找不出深拷贝和浅拷贝的主要区别。我在这方面经历了很多理论,但我需要用适当的例子来解释。我有将一个对象复制到另一个对象中的程序。-->

代码语言:javascript
运行
复制
   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();
        }
    }

这是浅拷贝还是深拷贝?有谁能给我一个合理的答案。如果它是一个深拷贝,那么请为这个程序提供浅层拷贝的代码,这个程序做同样的对象复制工作,而反过来。

如果以上是浅拷贝,那么即使这也应该是浅拷贝->

代码语言:javascript
运行
复制
            A ob1 = new A();
            ob1.a = 10;
            ob1.display();
            A ob2 = ob1;
            ob2.a = 444;
            ob1.display();
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-05 19:48:14

从链接这里

浅层复制尽可能少。集合的浅副本是集合结构的副本,而不是元素的副本。对于浅拷贝,两个集合现在共享各个元素。 深拷贝复制了一切。一个集合的深层副本是两个集合,其原始集合中的所有元素都被复制。

您的示例是创建一个浅副本。

代码语言:javascript
运行
复制
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.

深印本将是-

代码语言:javascript
运行
复制
 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.
票数 60
EN

Stack Overflow用户

发布于 2016-10-07 12:40:05

这既不是浅的,也不是深的,这是一个引用copy.let我解释:有两种类型的变量:值类型和引用类型。

值类型是计算机内存中保存变量实际值的(命名)位置。例如: int是一个值类型,所以当您编写这一行代码时:

代码语言:javascript
运行
复制
int MyInt = 5;

当执行这一行代码时,运行时将在RAM中找到一个位置,并在其中写入值5。所以,如果你搜索那个位置,你会发现一个实际值为5。

引用类型-in对比度-是内存中的一个(命名的)位置,它不实际保存变量的值,而是保存存在该值的内存位置。例如,假设您编写了以下代码:

代码语言:javascript
运行
复制
MyClass myObject = new MyClass();

所发生的是虚拟机(运行时):1-查找并找到内存中的可用位置,创建MyClass类的一个实例。假设该对象的位置恰好位于内存中的字节# AA3D2。

2-在内存中找到一个位置并创建一个MyClass类型的引用(引用是指向内存中某个位置的“箭头”),将其命名为"myObject“并在其中存储值AA3D2。

现在,如果您查看"myObject“变量,您会发现它不是类实例,而是AA3D2,它表示持有该类实例的内存的位置。

现在,让我们检查给我的OP的代码:

代码语言:javascript
运行
复制
A ob1 = new A();

这将生成一个名为ob1的变量,创建A类的实例,并将该类的位置存储在ob1中

代码语言:javascript
运行
复制
ob1.a = 10;
ob1.display();

这将改变A类中的变量a。然后调用display()方法。

代码语言:javascript
运行
复制
A ob2 = new A();

在这里,它创建一个名为ob2的变量,创建类A的一个实例,并将其位置分配给ob2。

到目前为止,您在内存中有两个A类实例和两个变量,每个都指向其中一个变量。下面是有趣的部分: ob2 = ob1;

变量ob2被指定为变量ob1的值。因为ob1包含A的第一个实例的内存位置,所以现在ob1和ob2都指向内存中的相同位置。使用其中之一做任何事情都完全是在对另一个做同样的事情。

ob2 = ob1意味着要复制引用。

票数 5
EN

Stack Overflow用户

发布于 2013-08-05 19:48:54

这是一个浅拷贝,因为如果您修改ob2的变量--然后尝试打印ob1 --它们将是相同的。这是因为C#中的类创建了它们之间的链接。如果要执行深度复制,则应实现复制方法并手动复制字段。类似于:

代码语言:javascript
运行
复制
  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;
    }



    }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18066429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档