在.Net,大家都知道引用类型的深复制、浅复制吧。
,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制。若objA=objB,则objA和objB本质上对应着内存中的一块地址、共享空间。所以objB.PropA=XXX,会导致objA.PropA也会变化。如果不注意、就会导致意外的问题,而且很难注意、debug。这种情况,基本都得用深复制来解决。
下面举例来说
1 protected void Page_Load(object sender, EventArgs e) 2 { 3 //string虽然也是引用类型,但微软对string做了特殊处理、对外表现的像值类型 4 //以下分别独立 5 string s1 = "111"; 6 string s2 = "111"; 7 string s3 = s2; 8 s1 = "111111111111111"; 9 s2 = "222222222222222"; 10 11 //引用类型 12 var list = GetElemsFromDBOrCache(); 13 list[0] = "1111111111111111"; 14 Response.Write(list[0]); 15 } 16 17 private List<string> GetElemsFromDBOrCache() 18 { 19 List<string> list; 20 if (Cache["key"] != null) 21 { 22 list = Cache["key"] as List<string>; 23 } 24 else 25 { 26 list = new List<string> { "1", "2", "3" }; //从DB中读取,此处省略 27 Cache["key"] = list; 28 } 29 //在调用端修改list会导致修改缓存:因为调用端修改list=>引用本地Cache,浅复制、 30 return list; 31 32 //使用深复制方法,避免在方法外修改缓存 33 //深复制方法1: 34 //List<string> newList = new List<string>(); 35 //foreach (var elem in list) 36 //{ 37 // newList.Add(elem); 38 //} 39 //return newList; 40 //深复制方法2:序列化后返回新变量 可能还有其他方法 41 //string json = JsonConvert.SerializeObject(list); 42 //List<string> newList = JsonConvert.DeserializeObject<List<string>>(json); 43 //return newList; 44 }