CSDN广告是越来越多了,所有博客笔记不再更新,新网址 DotNet笔记
说起来深度复制,浅度复制,就不得不说值类型与引用类型!
不说概念,换个说法或许更容易理解,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Ch09Ex03
{
class MyClass
{
public int val;
}
struct myStruct
{
public int val;
}
class Program
{
static void Main(string[] args)
{
MyClass objectA = new MyClass();
MyClass objectB = objectA;
objectA.val = 10;
objectB.val = 20;
myStruct structA = new myStruct();
myStruct structB = structA;
structA.val = 30;
structB.val = 40;
Console.WriteLine("objectA.val = {0}", objectA.val);
Console.WriteLine("objectB.val = {0}", objectB.val);
Console.WriteLine("structA.val = {0}", structA.val);
Console.WriteLine("structB.val = {0}", structB.val);
Console.ReadKey();
}
}
}
输出结果:
值类型: 在内存的一个地方存储了他们自己和他们的内容。
引用类型:在内存的一个地方存放了他们的引用(地址),在别的地方存储的是他们的值!
值类型与引用类型的区别:值类型不能为NULL
常见引用类型:数组,string ,常见的类对象
值类型 :我们常见的简单的数据类型,还有结构!
两种类型 赋值(A=B)的区别:
值类型是:“拷贝” 两个相互赋值的值类型变量他们互不相关,只是“长得一样”
引用类型:“别名” 你叫张三,昵称叫“狗蛋”!不管是叫张三还是叫狗蛋,其实叫的是一个人!
从一个变量到另一个变量按埴复制对象,而不是引用复制对象!这样就会很麻烦,因为一个对象可能包含许多其他的引用成员,将每一个对象引用类型的成员复制到另一个对象就不可能成功! 这就是浅度复制!
深度复制:与浅度复制相比,就是避免引用类型的复制变量的地址,我们的目的是引用变量复制的也是值。
方法有两种:
1)实现ICloneable的接口,注意必须实现Clone方法!在从新实现Clone方法的时候,我们可以采用任何方式处理引用类型变量
2)具体实现自定义方法,以后更新!原理同上!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DeepCopy
{
class A : ICloneable
{
private int a;
public int aa
{
set { a = value; }
get { return a; }
}
public Object Clone()
{
A Temp = new A();
Temp.a = this.a;
return Temp;
}
}
class Program
{
static void Main(string[] args)
{
/*常规的方法!*/
A testA3 = new A();
A testA4 = testA3;
testA3.aa = 30;
testA4.aa = 40;
Console.WriteLine("普通复制法:" + testA3.aa);
Console.WriteLine("普通复制法:" + testA4.aa);
/*实现IClone接口的Clone方法!*/
A testA1 = new A();
A testA2 = (A)testA1.Clone();
testA1.aa = 10;
testA2.aa = 20;
Console.WriteLine("ICloneable接口实现法:" + testA1.aa);
Console.WriteLine("ICloneable接口实现法:" + testA2.aa);
Console.Read();
}
}
}
结果:
总之,不管是什么样的办法,原理都是一个:想法设计避免引用复制!