• ベストアンサー

VB.netでコレクションを変更させないようにするには

C#、VB.net(.net framework 2.0)で開発しております。 FamilyクラスのListフィールド_peopleには外部からの変更操作(Add、Remove等)を許可したくないのですが、 以下のようにReadOnlyのプロパティを設けても、代入操作はできないもののコレクション自体への変更は可能となってしまいます。 ※family.People.Add(mem) 等 IListやICollectionインターフェースをImplementして独自のコレクションを作り、 AddやRemoveメソッド内で例外を投げたりすることも考えたのですが、 そもそもコンパイルを通したくありません。 こういった場合、どのように実装するのが定石でしょうか? 宜しくお願い致します。 以下コード例 Public Class Family Dim _people As List(Of Member) Public ReadOnly Property People() As Member Get Return _people End Get End Property End Class

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

読み込み専用のリストが欲しいのですよね。 ・IList(Of T) が欲しいのであれば,List(Of T).AsReadOnly メソッド http://msdn.microsoft.com/ja-jp/library/e78dcd75.aspx ・IList が欲しいのであれば,ArrayList.ReadOnly メソッド http://msdn.microsoft.com/ja-jp/library/t304hsay.aspx あとは,ToArrayメソッドで配列化という手もありますが。 http://msdn.microsoft.com/ja-jp/library/x303t819.aspx

i_110
質問者

お礼

ありがとうございます。 >AsReadOnly メソッド 素晴らしいです。まさにこれを求めていました。 本当にありがとうございました。 しかしこういったものは教えて頂かなかったら一生気付かない気がしますね…いや、単に私の調査不足でしょうか。 ともあれ、大変感謝しております。ありがとうございました。

その他の回答 (1)

  • moooove
  • ベストアンサー率0% (0/1)
回答No.1

Public Class Family  Private _people As List(Of Member)  'コンストラクタ  Public Sub New (ByRef arg As List(Of Member))   _people = New List(Of Member)(arg)  End Sub  'フィールド値を取得するメソッド  Public Function get(ByVal index As Integer) As Member   Return _people.item(index)  End Function End Class 通常なら上記のようにgetメソッドのみを持つラッパークラスを作成するのが普通ですが、 インターフェースを継承したいというあたりを考えると IListやICollectionとしても扱いたい場面があるということでしょうか? _peopleがListクラスのインスタンスである以上、AddやRemoveメソッドに制限をかけることは不可能です。 おおもとのインスタンスに影響を与えたくないという意味なら、 私なら_peopleの参照するインスタンスのコピーを渡す方法を取ります。 すなわち、 Return New List(Of String)(_people) といったようにします。

i_110
質問者

お礼

ありがとうございます。 >IListやICollectionとしても扱いたい場面があるということでしょうか? その通りです。IEnumerableを実装するという手もあるのでしょうが… >私なら_peopleの参照するインスタンスのコピーを渡す方法を取ります。 そうですね。しかし、受け取ったリストへの変更操作ができてしまうので混乱のもとになり、 スマートで無い気がしていました。 ともあれ、ありがとうございました。大変参考になりました。

関連するQ&A