DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ArrayList プロパティについて

環境/言語:[OS : Windows XP Home Edition / 言語 : Visual Basic 2005 / .NET Framework : 2.0]
分類:[.NET]

2006/03/26(Sun) 08:04:43 編集(投稿者)

【解決したい問題】

 下記2点について、コーディング上の定石のようなものがあればご教授頂きたく、質問させて頂きます。

・オリジナルのクラスに ArrayList プロパティを持たせる場合、クラスのコンストラクタ(クラスのインスタンス作成時に呼ばれるメソッド)に、ArrayList のインスタンス作成を含ませるべきでしょうか? それとも、クラスのインスタンスを作成する側で、ArrayList のインスタンス作成を行うべきでしょうか?

・また、ArrayList のインスタンスが不要となった際、リソース解放のため、ArrayList のインスタンス = Nothing と記述した方がよいのでしょうか?

 前者について、クラスのコンストラクタに ArrayList を含ませるかどうかケースバイケースであるならば、その判断は以下の通りで正しいでしょうか?
「派生クラスも含め、クラスのインスタンス作成時、毎回 ArrayList のインスタンスを作成するような処理であれば、クラスのコンストラクタで ArrayList のインスタンス作成を行う。」

 可能な限り、汎用的なクラスを作成したいと思っております。そのためには余計な機能は極力持たせないようにしたいのですが、ArrayList プロパティのインスタンス作成はクラスのコンストラクタで行う方が便利なのか、それともクラスのインスタンス作成毎にクラスのインスタンス作成側のコードで行わせる方が汎用的なのか判断がつきませんでした。
 定石的なものがあれば、それに沿う形で設計し、使いやすいクラスを作りたいと思っております。また、自分はこうしている等、独自のコーディング方法を持っていらっしゃる方がいらっしゃいましたら、ご教授の程、宜しくお願い申し上げます。
お世話になります。

■No15025に返信(しろひとさんの記事)
定石とやらは知りませんが、
セッター やら Add なんかの、
内部で持っている ArrayList に操作を行うメソッドがあったとして、
そのメソッド内で操作したい ArrayList が Nothing のときに、New するといった方法も
あると思います。

> ・また、ArrayList のインスタンスが不要となった際、リソース解放のため、ArrayList のインスタンス = Nothing と記述した方がよいのでしょうか?
ArrayList の中に入っているものによっては、
参照が消えるだけで、中身の破棄は保証できない事に注意が必要ですね。
■No15025に返信(しろひとさんの記事)
> ・オリジナルのクラスに ArrayList プロパティを持たせる場合、
> クラスのコンストラクタ(クラスのインスタンス作成時に呼ばれるメソッド)に、
> ArrayList のインスタンス作成を含ませるべきでしょうか?
> それとも、クラスのインスタンスを作成する側で、
> ArrayList のインスタンス作成を行うべきでしょうか?

場合によりけりですね。
たとえば、コレクション クラスのようなものであるならば、
アイテムを利用するにおいて必須になるため、クラスがインスタンス化した場合にインスタンス化すべきです。

# Add メソッドなどで暗黙的にというのは私的には反対です。

> ・また、ArrayList のインスタンスが不要となった際、リソース解放のため、
> ArrayList のインスタンス = Nothing と記述した方がよいのでしょうか?

スコープによっては、GC を早めることが期待できるかもしれませんが、する必要はないですね。

> 前者について、クラスのコンストラクタに ArrayList を含ませるかどうかケースバイケースであるならば、
> その判断は以下の通りで正しいでしょうか?
> 「派生クラスも含め、クラスのインスタンス作成時、毎回 ArrayList のインスタンスを作成するような処理であれば、
> クラスのコンストラクタで ArrayList のインスタンス作成を行う。」

すみません、これについてはちょっと意味がわかってません。
私と同じ意味合いであるならば、仰るとおりです。

こういうものは、クラスの中ではなく外から見ると良いでしょうね。

...............................................................................................................
じゃんぬ - Microsoft MVP for Visual Developer C#
  C#, VB.NET 入門  http://jeanne.wankuma.com/
  じゃんぬねっと日誌 http://blogs.wankuma.com/jeanne/
> ・オリジナルのクラスに ArrayList プロパティを持たせる場合、クラスのコンストラクタ(クラスのインスタンス作成時に呼ばれるメソッド)に、ArrayList のインスタンス作成を含ませるべきでしょうか? それとも、クラスのインスタンスを作成する側で、ArrayList のインスタンス作成を行うべきでしょうか?

インスタンスの管理者が誰なのかを考えると、それぞれは異なるものだと思います。

ListView1.ListViewItemSorter = New MyItemSorter
この場合、もし独自のソート実装があれば渡してくれというものです。

> ArrayList プロパティのインスタンス作成はクラスのコンストラクタで行う方が便利なのか、それともクラスのインスタンス作成毎にクラスのインスタンス作成側のコードで行わせる方が汎用的なのか判断がつきませんでした。

たぶん、よほどリソースを食うので初回アクセスまでインスタンスは作成しないという場合でも
外からインスタンスを与える場面は想像しにくいです。
コメントありがとうございます。
大変参考になりました。

クラス内の ArrayList については、
慎重にクラス設計をし、クラス内で ArrayList を持たせる必要性から
再検討致します。現段階での考えとしては、TreeView の TreeNode のような
階層構造のデータを扱うため、クラスのインスタンス生成時に自動的に
インスタンスを生成する方が感覚的にあっているかと考えております。

ArrayList = Nothing について
上述のような階層構造を持つデータについて、ある階層以下のデータが
全て不要となる場合、最下層のデータ(ArrayList)から参照を削除していき、
最後に親の層のデータ(ArrayList)の参照を削除しようと考えています。
リソース解放の意味において、ArrayList = Nothing の記述はあまり意味が
ないとのご指摘もありましたが、階層構造を持つデータの上位の ArrayList を
削除する際に、子の ArrayList もコード上で削除するなりして、
少しでもプログラム上で不要となったことを宣言しておきたいと考えて
おります。

処理速度を要求されるプログラムではないため、GC の勉強も含め、
可能な限りパソコンに優しいプログラムを書きたいと考えております。
また、リソースの解放については、オープンしたファイルを解放するくらいしかやったことがありません。私は Visual Studio .NET 2002 からの VB ユーザーです。ブランク期間があり、VB に触れたのは約半年ほどです。
ArrayList = Nothing は、参照を削除するという目的で、リスト内のオブジェクトの破棄に注意しながらコーディングする、ということを理解致しました。

勉強になり、また次の課題が見つかりました。
ご教授有難うございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板