浅拷贝和深拷贝的区别:
浅拷贝:
修改副本的值类型字段不会影响源对象对应的字段,修改副本的引用类型字段会影响源对象,因为源对象复制给副本对象的时候,是引用类型的引用地址,也就是两者引用的是同一个对象。
深拷贝:
无论值类型还是引用类型的字段,修改副本对象不会影响源对象,即使是引用类型,也是重新创建了一个新的对象引用。
要想自定义类型具有Clone拷贝的能力,就得继承ICloneable接口,然后根据需求,实现Clone方法以便实现浅拷贝或者深拷贝。
浅拷贝示例:
namespace WebApplication
{
public class Employee : ICloneable
{
public string IDCode { get; set; }
public int Age { get; set; }
public Department Department { get; set; }
//实现ICloneable接口成员
public object Clone()
{
return this.MemberwiseClone();
}
}
public class Department
{
public string Name { get; set; }
public override string ToString()
{
return this.Name;
}
}
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//初始化Employee对象employeeA
Employee employeeA = new Employee() { IDCode = "A", Age = 10, Department = new Department() { Name = "DepartmentA" } };
//从employeeA 浅拷贝出 employeeB
Employee employeeB = employeeA.Clone() as Employee;
//修改employeeB对象的属性
employeeA.IDCode = "B";
employeeA.Age = 15;
employeeA.Department.Name = "DepartmentB";
//输出以便验证
Response.Write(employeeB.IDCode); // A
Response.Write(employeeB.Age); //10
Response.Write(employeeB.Department.ToString()); //DepartmentB
}
}
}
从输出结果可以验证得到结果:
1、IDCode即使是string引用类型,Object.MemberwiseClone 依然为其创造了副本,在浅拷贝中,我们可以将string当做值类型来看待。
2、Employee的Department属性是引用类型,改变源对象employeeA中的值,会影响到副本对象employeeB
浅拷贝和深拷贝的区别托福答案 www.yztrans.com
浅拷贝:
修改副本的值类型字段不会影响源对象对应的字段,修改副本的引用类型字段会影响源对象,因为源对象复制给副本对象的时候,是引用类型的引用地址,也就是两者引用的是同一个对象。
深拷贝:
无论值类型还是引用类型的字段,修改副本对象不会影响源对象,即使是引用类型,也是重新创建了一个新的对象引用。
要想自定义类型具有Clone拷贝的能力,就得继承ICloneable接口,然后根据需求,实现Clone方法以便实现浅拷贝或者深拷贝。
浅拷贝示例:
namespace WebApplication
{
public class Employee : ICloneable
{
public string IDCode { get; set; }
public int Age { get; set; }
public Department Department { get; set; }
//实现ICloneable接口成员
public object Clone()
{
return this.MemberwiseClone();
}
}
public class Department
{
public string Name { get; set; }
public override string ToString()
{
return this.Name;
}
}
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//初始化Employee对象employeeA
Employee employeeA = new Employee() { IDCode = "A", Age = 10, Department = new Department() { Name = "DepartmentA" } };
//从employeeA 浅拷贝出 employeeB
Employee employeeB = employeeA.Clone() as Employee;
//修改employeeB对象的属性
employeeA.IDCode = "B";
employeeA.Age = 15;
employeeA.Department.Name = "DepartmentB";
//输出以便验证
Response.Write(employeeB.IDCode); // A
Response.Write(employeeB.Age); //10
Response.Write(employeeB.Department.ToString()); //DepartmentB
}
}
}
从输出结果可以验证得到结果:
1、IDCode即使是string引用类型,Object.MemberwiseClone 依然为其创造了副本,在浅拷贝中,我们可以将string当做值类型来看待。
2、Employee的Department属性是引用类型,改变源对象employeeA中的值,会影响到副本对象employeeBSAT答案 www.yzyxedu.com