摘要
在对List<T> 的对象进行复制时,自然的就有深拷贝与浅拷贝问题。深拷贝与浅拷贝的区别在于,当从原本的list复制出的list之后,修改其中的任意一个是否会对另一个造成影响,即这两个list在内存中是否储存在同一个区域,这也是区分深拷贝与浅拷贝的重要依据
在如下代码中:
List<string> MACBarcodeArr = new List<string>();
List<string> AllMACBarcodeArr = new List<string>();
foreach (Block b in inspection.Blocks.OrderBy(w => w.Number))
{
AllMACBarcodeArr = AllMACBarcodeArr.Concat(MACBarcodeArr).ToList();
MACBarcodeArr.Clear();
foreach (Barcode bar in b.Barcodes)
{
if (bar.Name.ToUpper().Contains("MAC"))
{
//MACBarcode = bar.CodeText.Trim();
MACBarcodeArr.Add(bar.CodeText.Trim());
Trace.WriteLine("Block Number is : " + b.Number + " MACBarcode is = " + bar.CodeText);
}
}
// List深拷贝
List<string> MACBarcodeArrTemp = new List<string>(MACBarcodeArr);
blockMacMap.Add(b.Number, MACBarcodeArrTemp);
}
在通过List<string> 对象 MACBarcodeArr 往字典里面存放每次更新的数据的时候,如果不使用一层List<string> 对象的深拷贝
会造成所有的 MACBarcodeArr 都会是最后一个MACBarcodeArr存储的值,从而造成错误!
在使用引用类型的对象的时候,更新数据要考虑使用深拷贝,来屏蔽后一次数据更新对已经写入数据的更新。
源列表是List< T >
T是值类型的情况
浅复制:
- List< T > oldList = new List< T >();
- oldList.Add(..);
- List< T > newList = oldList;
深复制:
- List< T > oldList = new List< T >();
- oldList.Add(..);
- List< T > newList = new List< T >(oldList);