面试大法
-
C# 当中的深拷贝和浅拷贝
-
浅拷贝:引用类型的浅拷贝只是拷贝对象的引用地址,而不对其值进行拷贝。拷贝后的两个对象的区别是,当修改拷贝后的对象的值被拷贝的那个对象的值也会发生改变,因为他们指向的都是同一个引用地址。C# 的 基类对象Object实现了一个浅拷贝的方法 MemberwiseClone()
public class myclass { public class1 c1 = new class1(); public string Name{get;set;} public string Age {get;set;} //浅克隆对象:浅拷贝的复制对象 共享原始对象的引用类型成员对象 这里指的共享 class1 public new object GetMemberwiseClone()=>base.MemberwiseClone(); } public class class1 { public string NickName get;set;} } static void Main(string[] args) { myclass mc = new myclass(); myclass cloneMc = (myclass)mc.tMemberwiseClone(); cloneMc.c1.NickName = "彭麒"; //这里的赋值将影响原始对象 mc 的 用类型成员对象class1 的 NickName 属性 }
-
深拷贝:引用类型的深拷贝其实是拷贝的对象的值,拷贝对象的引用地址和源对象的引用地址不一致。这样就实现了互不影响的效果。在值类型当中,只有深拷贝,因为值类型复制后不会影响另一个值类型。
int a=12; int c=a;//进行了深拷贝 c=232 //不影响
- 对于需要实现深拷贝的做法一般是我们自己去实现ICloneable接口。一下就是实现克隆的方法:
public class myclass:ICloneable { public class1 c1 = new class1(); public string Name{get;set;} public string Age {get;set;} //浅克隆对象:浅拷贝的复制对象 共享原始对象的引用类型成员对象 这里指的共享 class1 public new object GetMemberwiseClone()=>base.MemberwiseClone(); public object Clone() { //重新创建一个新的对象 myclass newMc = new myclass(); //给新的对象重新分配一个新的引用 newMc.c1 = new class1(); // 对象属性进行复制 newMc.c1.NickName = c1.NickName; //对象属性进行复制 newMc.c1.Name = c1.Name; //对象属性进行复制 newMc.c1.Age = c1.Name; return newMc; } } public class class1 { public string NickName get;set;} } static void Main(string[] args) { //浅拷贝 myclass mc = new myclass(); myclass cloneMc = (myclass)mc.GetMemberwiseClone(); cloneMc.c1.NickName = "彭麒"; //这里的赋值将影响原始对象 mc 的 用类型成员对象class1 的 NickName 属性 //深拷贝 myclass mc1 = new myclass(); myclass cloneMc1 = (myclass)mc.Clone(); cloneMc.c1.NickName = "彭麒"; //这里的赋值不会影响原始对象 mc1 的任何状态。 }
- 另外深克隆的其他方式还可以是通过序列化与反序列化来实现。
-
-
C# ReadOnly 和 Static 的区别
-
C# 所有类型的基类
-
C# Object对象的方法
-
Oracle 查询语句耗时过长怎么优化
-
Oracle 表字段为varchar2类型,当表中有千万级别的数据怎么把字段改为Date类型
-
C# 重构的方式
-
C# 委托和事件