我怀疑我只是误解了Array类的Clone()方法.但它会读取"创建System.Array的浅拷贝",所以我认为这意味着新的对象指针,而不是相同的对象指针......
以下真的应该发生吗?
假设一个测试对象......
public class testObject
{
public int propInt { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及以下测试......
//create a the list
List<testObject> testList = new List<testObject>();
//add items to the list
testObject item1 = new testObject();
item1.propInt = 1;
testList.Add(item1);
testObject item2 = new testObject();
item2.propInt = 2;
testList.Add(item2);
//create what should be a COPY of the array
testObject[] testArray;
testArray = (testObject[])testList.ToArray().Clone();
foreach (testObject item in testArray)
{
item.propInt++;
}
//check items in list
foreach (testObject item in testList)
{
Trace.WriteLine("List:" + item.propInt);
}
//check items in coppied array
foreach (testObject item in testArray)
{
Trace.WriteLine("Array:" + item.propInt);
}
Run Code Online (Sandbox Code Playgroud)
我希望结果是......
List:1
List:2
Array:2
Array:3
Run Code Online (Sandbox Code Playgroud)
因为我假设我做了一个克隆,所以该克隆中的引用将是一个具有与制作克隆时相同属性的相同对象类型的新实例.此外,我会在修改它们之后假定原始列表未被触及.
没有快乐,这个测试的输出实际上是......
List:2
List:3
Array:2
Array:3
Run Code Online (Sandbox Code Playgroud)
所以我对Clone的操作似乎也反映在克隆的源代码中,这对我来说意味着它没有复制它将指针复制到对象的对象,并且打破了克隆方法开始的目的. ??
浅复制意味着您获得新数组,但数组中的值将按原样复制.对于引用类型(作为您的类),它意味着复制引用,因此您的新数组指向类的相同实例.
如果您想要执行深层复制,您必须自己完成:
var copy = source.Select(x => new testObject() { propInt = x.propInt }).ToArray();
Run Code Online (Sandbox Code Playgroud)
或使用克隆库(例如CloneExtensions).