最近项目中用到的深拷贝用法记录如下:
数组复制
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~";
}