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 に答える