3

我想确认对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# 很陌生。)

4

2 回答 2

3

它只会复制对象引用而不执行任何克隆(浅或深)。

通常,它会执行结构的浅拷贝,尽管只是由于结构的按值传递语义。但是在这种情况下,由于您将其键入为接口,因此我相信值类型将被装箱不是浅拷贝。

如果您需要执行自己的元素深层复制,则可以使用此重载并自己调用复制构造函数:

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# 没有用于深度复制的本机内置方法*。这通常是根据开发人员的需要针对每个对象实现的。

*如果您的设计允许,您可以使用一些方法来执行通用深度复制

于 2013-06-25T22:21:00.337 回答
2

不,键和值都是按值复制的,这是一个拷贝。

请注意,无论键或值是值类型还是引用类型,这都是正确的。

为清楚起见,按值复制的值类型意味着按值复制字段。

为了更加清楚,对于引用类型,引用是按值复制的。由于引用是按值复制的,因此它是浅拷贝。

于 2013-06-25T22:20:23.753 回答