8

C ++のバックグラウンドから来て、C#を学ぼうとすると、私が遭遇した中で最も苛立たしい言語の省略の1つは、constキーワードに相当します。

そのため、C#で定数の正確性を実現するために使用できるパターンを決定しようとしています。

この回答には興味深い提案があります。すべてのタイプに対して読み取り専用のインターフェースを作成することです。しかし、Matt Cruikshankがコメントで指摘したように、クラスにコレクションやその他の豊富なタイプがある場合、これは問題になります。特に、タイプを制御できず、読み取り専用インターフェースを実装できない場合。

豊富なタイプとコレクションを処理できるパターンやソリューションはありますか、それともC#で単にコピーを作成する必要がありますか?C#のconstの正当性を完全に諦めたほうがいいですか?

4

1 に答える 1

7

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サービスの結果をキャッシュに保存している場合は、代わりにキャッシュされたアイテムのコピーを返します。これにより、ユーザーが結果を変更した場合でも、キャッシュされた値が誤って変更されることはありません。

ですから、長短は、返されるすべてのタイプの定数の正確さについて心配する必要がないということです。それはあまりにも多すぎます。私はあなたが返すものだけを心配します。それは、変更された場合、他のユーザーに副作用を引き起こす可能性があります。

于 2012-07-24T21:28:50.717 に答える