我想确认https://stackoverflow.com/a/10387423/368896的答案是正确的,适用于以下情况:
// These IDataHolder instances contains a property "name",
// and another data member that is a large array.
// A copy constructor exists that makes a deep copy.
public MyFunction(IEnumerable<IDataHolder> columns)
{
// Is the copy constructor called?
this.columns = columns.ToDictionary(c => c.info.name, c => c);
}
我相信复制构造函数不被调用;即,对toDictionaary
的调用不执行深层复制,只复制引用。
但是,我找不到对此的确认。
我说错了吗? toDictionary()
仅执行浅拷贝吗?
(注意:我有很强的C ++背景,但我是C#的新手。)
答案 0 :(得分:2)
不,键和值都是按值复制的,这是浅副本。
注意,无论键值或值是值类型还是引用类型,都是如此。
为清楚起见,按值复制的值类型表示按值复制字段。
为了更加清晰,对于引用类型,引用按值复制。由于引用是按值复制的,因此它是一个浅表副本。
答案 1 :(得分:2)
它只会复制对象引用,而不会执行任何克隆(浅或深)。
通常情况下,它会执行 structs 的浅层副本,尽管它只是出于结构的值传递语义。但是在这种情况下,由于您将其键入为界面,我确实认为值类型will be boxed和不是浅层复制。
如果您需要执行自己的元素深层副本,则可以使用this overload并自行调用复制构造函数:
public MyFunction(IEnumerable<IDataHolder> columns)
{
//replace c.DeepCopy() with whatever the deep copying function is
this.columns = columns.ToDictionary(c => c.info.name, c => c.DeepCopy());
}
主要原因是因为C#没有深层复制的本机内置方法*。这通常是开发人员需要按对象实现的。
*如果您的设计需要,可以使用some ways to perform generalized deep copying