首页 热点资讯 义务教育 高等教育 出国留学 考研考公

C#中引用类型和值类型的浅度复制和深度复制的问题?

发布网友 发布时间:2022-04-26 03:01

我来回答

3个回答

热心网友 时间:2022-04-23 05:09

从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂。因为一个对象可能包含许多对象的引用,例如字段、成员等,这将涉及许多烦人的处理操作。把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型。

按照成员复制简单的对象可以通过派生于System.Object的MemberwiseClone()方法来完成,这是一个受保护的方法,但很容易在对象上定义一个该方法的公共方法。这个方法提供的复制功能称为阴影复制,因为它没有考虑引用类型成员。因此,新对象中的引用成员就会指向与源对象中相同成员的对象,在许多情况下这并不理想。如果要创建成员的新实例,此时应复制值,而不复制引用,就需要使用深度复制。

我们看下面一个例子,其中有一个值类型的域:

public class Cloner
{
public int Val;
public Cloner(int newVal)
{
Val = newVal;
}

public object GetCopy()
{
return MemberwiseClone();
}
}

我们用下面这段代码进行测试:

Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
Console.WriteLine("mySource.Val = ",mySource.Val);
Console.WriteLine("myTarget.Val = ",myTarget.Val);
mySource.Val = 2;
Console.WriteLine("mySource.Val = ",mySource.Val);
Console.WriteLine("myTarget.Val = ",myTarget.Val);

得出如下结果:

关键字过滤,参见

另外,站长团上有产品团购,便宜有保证

热心网友 时间:2022-04-23 06:27

有点想复杂了吧?

其实很好理解,public int Val;明显是值类型,所以要“逐位复制”

也就是说 myTarget 最终会有自己的存放Val的地址

热心网友 时间:2022-04-23 08:01

MemberwiseClone()应该是这样的,对于原对象中值类型的字段进行逐位复制,而对于引用类型的字段则复制引用。详细参见:http://msdn.microsoft.com/zh-cn/library/system.object.memberwiseclone(VS.95).aspx

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com