Enumerable.ToDictionary <tsource,tkey =“”>执行深层复制吗?</tsource,>

时间:2013-06-25 22:16:59

标签: c#

我想确认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#的新手。)

2 个答案:

答案 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