深拷

       最近项目中用到的深拷贝用法记录如下:

数组复制

public static void 数组复制()
{
    string[] arr = new string[] { "北京", "天津", "上海" };

    string[] brr = arr;
    bool b1 = object.ReferenceEquals(arr, brr);//true,验证了是同一个对象
    brr[0] = "新北京";                          //此时,arr也一同修改

    // Clone方法
    string[] crr = arr.Clone() as string[];    //浅表复制,会创建一个新对象,但引用是相同的.
    bool b2 = object.ReferenceEquals(arr, crr);//不是同一个对象.
    crr[1] = "新天津";                         //引用内存地址发生改变
   
    //CopyTo/Copy方法
    string[] drr = new string[arr.Length];
    arr.CopyTo(drr, 0);                  
    Array.Copy(arr, drr, arr.Length);     
}

List集合

        public static void ListDemo1()
        {
            bool IsSame;
            #region 值类型数据复制
            /*值类型复制*/
            List<int> list1 = new List<int> { 1, 2, 3, 4 };
            List<int> list2 = new List<int>(list1);
            list2[1] = 11;
            IsSame = object.ReferenceEquals(list1, list2);//out False  这两个是独立的实例
            
            /*引用类型String 复制,因为string调用了重载方法,所以和值类型一样,其他引用类型不可用如下方法*/
            //以上list1 list2是两个不同的实体
            List<string> lst1 = new List<string>() { "北京", "天津" };
            List<string> lst2 = new List<string>(lst1);
            lst2[1] = "TianJin";
            IsSame=object.ReferenceEquals(lst1, lst2);//out False  这两个是独立的实例
            
            #endregion


            List<string[]> lst11 = new List<string[]>() {
                 new string[]{"北京", "bj" },
                 new string[]{"天津", "tj" },
                 new string[]{"山东", "sd" }
            };

            /*不正确的方法*/
            //List<string[]> lst12 = new List<string[]>(lst11);//此时浅复制,因为List对象内容string[]是引用内容
            //lst12[1][1] = "tianjing~";                       //当list12改变时,lst11也改变

            //正确做法
            var lst12 = (List<string[]>)lst11.Select(x => x.Clone() as string[]).ToList<string[]>();
            lst12[1][1] = "tianjing~";
        }

阅读更多

没有更多推荐了,返回首页