3

クラスにプライベート辞書またはリストがあるとしましょう。他の人がリストを反復処理できるが、アイテムを変更するためのアクセス権がないように、読み取り専用の列挙子を返したい。

オリジナルのラッパークラスを作成する代わりに、オリジナルのアイテム/要素のコピーを返したいのですが。original.ToList<Type>().GetEnumerator()元のアイテムへの参照を含むリスト、または元のアイテムのコピーを含むリストを返すようなものはありますか?

インデックス作成も必要であることに注意してください(つまり、インデックスでアイテムにアクセスしても、アイテムを変更することはできません)。

4

3 に答える 3

5

メソッドはコレクションの新しいインスタンスを作成しますが、アイテム参照は引き続き古いアイテムを参照します。つまり、コンシューマーは内部コレクションを更新できませんでしたが、アイテム自体を更新することはできました。

アイテムの変更に関する適切なカプセル化があると仮定すると、このアプローチは機能しますが、新しいアイテム参照ごとにメモリを割り当てる必要があるため、大きなリストでは少しメモリを消費します。これが、ラッパーを返すことがしばしば好まれる理由の1つです。これにより、ラッパークラスの単一インスタンスに必要な余分なメモリが削減されます。

于 2012-08-01T21:59:25.853 に答える
3

ToList()Torray()どちらも値によって機能しますIEnumerable<>元のコンテナから新しいコンテナに値をコピーするだけです。

しかし、コピーされる値は参照である可能性が非常に高いです。

于 2012-08-01T22:09:12.993 に答える
2

へのまっすぐな呼びかけ

original.ToList<MyType>()

「浅い」コピーを作成します。リストは新しくなりますが、オブジェクトは同じになります。

"ディープ" コピーが必要な場合は、LINQ を使用して、項目をリストに追加する前に複製できます。

original.Select(item => new MyType(item)).ToList()

C++ のコピー コンストラクターと同様に、それ自体のインスタンスを取得してコピーを生成するコンストラクターがクラスにあると仮定すると、オブジェクトのコピーのリストが生成されます。

于 2012-08-01T22:04:27.907 に答える