- ベストアンサー
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
- みんなの回答 (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
その他の回答 (1)
- moooove
- ベストアンサー率0% (0/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) といったようにします。
お礼
ありがとうございます。 >IListやICollectionとしても扱いたい場面があるということでしょうか? その通りです。IEnumerableを実装するという手もあるのでしょうが… >私なら_peopleの参照するインスタンスのコピーを渡す方法を取ります。 そうですね。しかし、受け取ったリストへの変更操作ができてしまうので混乱のもとになり、 スマートで無い気がしていました。 ともあれ、ありがとうございました。大変参考になりました。
お礼
ありがとうございます。 >AsReadOnly メソッド 素晴らしいです。まさにこれを求めていました。 本当にありがとうございました。 しかしこういったものは教えて頂かなかったら一生気付かない気がしますね…いや、単に私の調査不足でしょうか。 ともあれ、大変感謝しております。ありがとうございました。