.Net深复制、浅复制
2016-04-21 20:05
309 查看
在.Net,大家都知道引用类型的深复制、浅复制吧。
,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制。若objA=objB,则objA和objB本质上对应着内存中的一块地址、共享空间。所以objB.PropA=XXX,会导致objA.PropA也会变化。如果不注意、就会导致意外的问题,而且很难注意、debug。这种情况,基本都得用深复制来解决。
下面举例来说
,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制。若objA=objB,则objA和objB本质上对应着内存中的一块地址、共享空间。所以objB.PropA=XXX,会导致objA.PropA也会变化。如果不注意、就会导致意外的问题,而且很难注意、debug。这种情况,基本都得用深复制来解决。
下面举例来说
protected void Page_Load(object sender, EventArgs e) { //string虽然也是引用类型,但微软对string做了特殊处理、对外表现的像值类型 //以下分别独立 string s1 = "111"; string s2 = "111"; string s3 = s2; s1 = "111111111111111"; s2 = "222222222222222"; //引用类型 var list = GetElemsFromDBOrCache(); list[0] = "1111111111111111"; Response.Write(list[0]); } private List<string> GetElemsFromDBOrCache() { List<string> list; if (Cache["key"] != null) { list = Cache["key"] as List<string>; } else { list = new List<string> { "1", "2", "3" }; //从DB中读取,此处省略 Cache["key"] = list; } //在调用端修改list会导致修改缓存:因为调用端修改list=>引用本地Cache,浅复制、 return list; //使用深复制方法,避免在方法外修改缓存 //深复制方法1: //List<string> newList = new List<string>(); //foreach (var elem in list) //{ // newList.Add(elem); //} //return newList; //深复制方法2:序列化后返回新变量 可能还有其他方法 //string json = JsonConvert.SerializeObject(list); //List<string> newList = JsonConvert.DeserializeObject<List<string>>(json); //return newList; }
相关文章推荐
- 链队列的实现
- 非常可乐
- 测试作业
- CodeForces 557A-Ilya and Diplomas【模拟】
- java集合框架09——HashTable和源码分析
- 51nod 1022 石子归并 环形+四边形优化
- Ajax 请求返回 html 页面并展示
- OSI七层与TCP/IP五层网络架构详解
- 基础算法学习之穷举
- bzoj4514 数字配对 费用流
- hdu 4296 Buildings
- (一)C++语言中类对象的本质
- 在Linux环境下mysql的root密码忘记解决方法
- Windows7系统下安装OpenSSL攻略
- Nginx负载均衡实现方案(结合tomcat实现)
- 你最喜欢做什么--兴趣问题清单
- hdu 1561(树形DP+背包)
- Mount挂载命令使用方法
- 写在省选之前
- struts2使用redirectAction,运行后地址没有改变,result中没有配置该result