私は現在 C# を学んでおり、ISet を含むクラスがある状況にあります。私はクライアントがこのセットを直接変更することを望んでおらず、ほとんどのクライアントは追加と削除のみを行っており、これを行うためにクラスを通じてアクセサーを提供しています。
しかし、このセットとその内容についてもっと知りたいというクライアントが 1 人います。この 1 つのクライアントの多くのメソッドでラッパー クラス自体を混乱させたくないので、セット自体を不変の方法で返すことができるようにしたいと考えています。
私はできないことがわかりました-まあ、そうではありません。私が持っていると思われる唯一のオプションは次のとおりです。
- IEnumerable を返します (いいえ: 機能が制限されています)。
- ReadOnlyCollection (いいえ: リストです);
- コピーを返します (いいえ: 悪い形式の私見です。クライアントは、実際のオブジェクトを変更しないことに気付かずに、返されたコレクションを変更できます。さらに、パフォーマンスのオーバーヘッドがあります)。
- 独自の ReadOnlySet を実装します (いいえ: ISet から派生させる必要があるため、ミューテーターを実装する必要があります。おそらく例外を発生させます。実行時ではなく、時間エラーをコンパイルします)。
何か不足していますか?私は不合理ですか?ラッパーでアクセサの完全なセットを提供する唯一のオプションですか? 大多数のクライアントに対してラッパーをクリーンに保つという当初の意図は間違っていますか?
2つの質問:
標準の C# 不変コレクション インターフェイスがないのはなぜですか? それはかなり合理的な要件のように思えますか?
ReadOnlyCollection が実際には ReadOnlyList であるのに、ReadOnlyCollection と呼ばれるのが煩わしいのはなぜですか? 私はそれがリストであることがわかるまで、弾丸を噛んでそれを使用するつもりでした(そして私はセットを使用します)。