• .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         }
  • 相关阅读:
    junit源码解析--测试驱动运行阶段
    junit源码解析--初始化阶段
    junit源码解析--核心类
    junit测试套件
    junit参数化测试
    junit忽略测试方法
    Junit4常用注解
    泛型技术
    在使用Java8并行流时的问题分析
    Linux 常用性能分析命令
  • 原文地址:https://www.cnblogs.com/nlh774/p/5418496.html
Copyright © 2020-2023  润新知