C#でのOOPに関する「ベストプラクティス」の質問があります(ただし、すべての言語に当てはまります)。
たとえば、プロパティアクセサを介して、パブリックに公開されるオブジェクトを含むライブラリクラスを持つことを検討してください。
class A
{
// Note: List is just example, I am interested in objects in general.
private List<string> _items = new List<string>() { "hello" }
public List<string> Items
{
get
{
// Option A (not read-only), can be modified from outside:
return _items;
// Option B (sort-of read-only):
return new List<string>( _items );
// Option C, must change return type to ReadOnlyCollection<string>
return new ReadOnlyCollection<string>( _items );
}
}
}
明らかに最適なアプローチは「オプションC」ですが、ReadOnlyバリアントを持つオブジェクトはごくわずかです(そして確かにユーザー定義クラスにはありません)。
あなたがクラスAのユーザーである場合、あなたは
List<string> someList = ( new A() ).Items;
元の(A)オブジェクトに伝搬しますか?または、コメント/ドキュメントに記述されているクローンを返すことはできますか?このクローンアプローチは、追跡が非常に難しいバグにつながる可能性があると思います。
C ++ではconstオブジェクトを返すことができ、constとしてマークされたメソッドしか呼び出せないことを覚えています。C#にはそのような機能/パターンはないのでしょうか?そうでない場合、なぜ含まれないのですか?const constnessと呼ばれると思います。
しかし、再び私の主な質問は、「何を期待しますか」またはオプションAとBの処理方法についてです。