2

多くの場合、コードは を受け取り、IEnumerable<T>そこに含まれるアイテムのシーケンスを永続化します。これを行う一般的な方法は、それを呼び出すToListことです。ただし、問題の実装が既に不変リストである場合、ToListそれを呼び出すのは無駄です。

コード内でのみコレクションを渡している場合は、提供されたオブジェクトが既に実装されていない限り(実装している)IEnumerable<T>のコンストラクターに を渡す拡張メソッドの使用を定義できます(その場合は、単純に次のように返されます-は)。そのようなクラスを実装するのは難しくありません。ただし、私の懸念は、そのようなクラスを自分で実装し、そのようなクラスを必要とする他のすべての人が同様に実装した場合、異なる「不変リスト」クラスを使用する人々によって記述されたコード間でオブジェクトが渡されるたびに、それが終了することです。防御的にコピーされる(以前の不変コピーの作成者が不変として認識しない形式に)。Supercat.ImmutableList<T>Supercat.IImmutableList<out T>Supercat.IImmutableList<T>

したがって、私は興味があります:アプローチにサブスクライブするすべてのオブジェクトが互いのスナップショットを不変として認識できるように、アイテムのシーケンスの不変のスナップショットを取得するための犯罪集団に近い何かを達成しているアプローチはありますか?リスト?たとえば、多くの人が不変クラスに特定の名前の関数を組み込んでいて、その名前が他の目的では使用されず、不変性を示す場合、同じアプローチを使用する他の人々のコードと効率的に相互運用可能なコードを作成するのはかなり簡単です。 (静的ジェネリック クラスとリフレクションを使用)。かなりの数の可能なアプローチを想像できますが、クリティカルマスに近いものは知りません. ソースからビルドできるパブリックドメインのものがいいと思います。

4

1 に答える 1

0

「不変」とは、元のデータの消費者が値を変更できないようにすることを意味する場合は、ReadOnlyCollection. ただし、この場合、基礎となるリストは依然として可変であるため、コンシューマーはそれが他の場所で変更されないことを保証できません。

真に不変のコレクションを探しているなら、おそらく F# 用に作成されたものを使用するのが最善の策です。この回答を参照してください。

于 2012-10-01T23:06:10.337 に答える