.Net深复制、浅复制

在.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         }
原文地址:https://www.cnblogs.com/nlh774/p/5418496.html