AsReadOnly() は、コレクションの読み取り専用イメージ (不変コレクションのコピーに比べて高価ではない) を取得するための便利なメソッドです。ImmutableList に AsReadOnly のようなメソッドがあるかどうか疑問に思っていますか? いいえの場合、同様に実装する簡単な方法はありますか?
2 に答える
不変コレクションは本質的に読み取り専用です。ImmutableList<T>
すでに実装IReadOnlyList<T>
およびIReadOnlyCollection<T>
インターフェースしているドキュメントを簡単に確認できます。
不変コレクションの要素にアクセスする場合、メモリは割り当てられません。一方、不変のデータ構造に要素を追加すると、新しい不変のコレクションが作成されます (そして、いくらかのメモリが使用されます)。多くの不変コレクションの実装では、すべてのデータを新しいコレクションにコピーするのではなく、古いコレクションの一部のデータを共有するため、ほとんどの場合、メモリ使用量/割り当て時間についてあまり気にする必要はありません。
などの一部のコレクションにImmutableHashSet<T>
は、メモリ割り当ての数に関して最適化されていることを示すドキュメントがあります。
不変コレクション間で一部のデータを共有する背後にある考え方は複雑ではありません。ウィキペディアには、不変の単一リンクリストの場合にメモリを節約する方法を示す簡単な例(素敵な図付き)があります。
ImmutableList<T>
は参照によってコピーされるため、パフォーマンスを犠牲にすることなく完全に安全に渡すことができます。AsReadOnly
したがって、コピーが簡単にならないため、メソッドは必要ありません。