C#で不変性を得ることができますか?確かに、あなたがそれのために設計するならば。インターフェイスなどを使用してクリエイティブなことを実行し、get
プロパティのみを公開し、変更可能なメソッドは公開しないようにすることができます。
とは言うものの、巧妙なユーザーがそれを実際の型にキャストすることを妨げるものは何もないことに注意してください(もちろん、C ++についても同じことが言えますが、定数をキャストすることもできます)。
ISomeReadOnlyInterface readOnly = new SomeFullObject();
// hah, take that read-only interface!
((SomeFullObject)readOnly).SomeMutatingMethod();
コレクションと同じです。ReadOnlyCollection(コレクション自体の動作の変更を防ぐ)を返した場合でも、コレクション内のデータは変更可能です(もちろんタイプで許可されている限り)。
ですから、ここには簡単な答えはありません。C++の機能を提供する「flip-a-switch」定数はありません。
それは本当にあなた次第です、あなたはすることができます:
- 型を不変になるように設計し、可変コレクションではなくイテレータ(または他の読み取り専用シーケンス)を返します。
- 毎回新しいコピーを返して、変更しても大したことはないようにします。
- 実際のデータを返し、改ざん動作を「未定義」のままにします。
- 等...
後者は、コレクションのようなものDictionary<TKey, TValue>
です。キータイプを可変タイプにすることができないと言うことは何もありません(ただし、そうすると悲惨です)。MSDNは、ハッシュコードが変更されるようにキーを変更すると、それが自分の首にあることを明確に示しています。 ..。。
私自身の仕事では、副作用を引き起こすような方法でクラスが変更される可能性があるという大きな懸念が実際にない限り、シンプルに保つ傾向があります。たとえば、Webサービスの結果をキャッシュに保存している場合は、代わりにキャッシュされたアイテムのコピーを返します。これにより、ユーザーが結果を変更した場合でも、キャッシュされた値が誤って変更されることはありません。
ですから、長短は、返されるすべてのタイプの定数の正確さについて心配する必要がないということです。それはあまりにも多すぎます。私はあなたが返すものだけを心配します。それは、変更された場合、他のユーザーに副作用を引き起こす可能性があります。