- - PR -
適切なインスタンスの作成方法について
1
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2009-02-06 14:16
連続的に投稿していますが、気になったので質問します。
自分で作ったクラスのインスタンスを作成する時に皆さんはどのような方法を取られていますか?
僕は今まで1番目の方法を使用していましたが、他の人が2番目の方法を使用していました。 確かに2番目の方法だとコードは1行ですっきりするのですが、Disposeされないんじゃないか?っと思っています。 皆さんはどのような方法を使われていますか? また、その方法を利用する理由も聞かせていただけれ幸いです。 この他にも「もっとこんな方法があるよ!」っというのもあればぜひ。 よろしくお願いします。 [ メッセージ編集済み 編集者: toto 編集日時 2009-02-06 14:21 ] | ||||||||||||||||
|
投稿日時: 2009-02-06 15:05
ご提示の例に関して言えば、どちらも私としては有り得ません。
コントロールは利用者にUIを提供するためのものです。 ですので、データの取得のためだけにコントロールが利用されている、 という例のコードはおかしいと思います。 提示の例のようなコードを書かないとdatatableにセットしたい値を取得する方法がないとしたら、 データの取得ロジックとUIが一緒くたになっているということですからそれは設計がまずいのではないでしょうか。 例はあくまで例だとして、Disposeしないといけないオブジェクトに対しての処理としては、1つ目の方法の方が好ましいとは思います。 | ||||||||||||||||
|
投稿日時: 2009-02-06 15:24
よねKENさん
回答ありがとうございます。
質問の趣旨とは外れてしまいますが、Controlと言うクラスは決してサーバーコントロール(UI)を生成するクラスではありません。 今回、 Entity・・・データを格納するための入れ物 Manager・・・DBとのアクセスを担当するクラス(UIから操作不可) Control・・・UIから操作可能な独自クラス。DBからのデータの取得など。 と言う構成を取りました。 もしかしたら、構成が適していないかもしれませんし、そもそもControlといネーミングが悪いかもしれませんが。。。 この辺についてもぜひ皆様の意見を伺いたいのですが、今回の質問の趣旨とは異なるのでまた別の機会に。 紛らわしくてすいません。
そうですか。 やはり2番目の方法ではDisposeされないということですかね? ありがとうございます。 | ||||||||||||||||
|
投稿日時: 2009-02-06 18:15
Control、UserControlというネーミングからてっきりWindowsアプリのUserControlなのかと勘違いしていました。 早とちりで的外れなコメントで申し訳ありません。
独自のクラスにIDisposableインタフェースを実装させることは私はあまりやりませんが、そのControl.UserクラスのDisposeは何をやっているのでしょうか? DBからのデータ取得というとDisposeはコネクションからの切断などをやっていたりするのでしょうか。その場合、Disposeをきちんと呼ぶように作ってないと困ることになりますね。
呼び出していないものは呼び出されません。 Disposeメソッドを呼び出すか、UsingステートメントでDisposeメソッドが呼ばれるようにする必要があります。 Finalizeメソッドを適切に作成してあれば、通常は、Disposeメソッドがまだ呼ばれていない場合に、そのFinalizeメソッド内部でDisposeに当たる処理を行うので、いつかは呼ばれます。 FinalizeメソッドはGCがオブジェクトを回収するタイミングでたいていは呼ばれますが、GCがいつオブジェクトを回収するかはわからないため、重要なリソースを握ったまま(例えばファイルをオープンしっぱなし)だと非常にまずいです。 | ||||||||||||||||
|
投稿日時: 2009-02-06 23:24
クラスによるかと思います。
日付の文字列を取得したいだけならDateTimeで、2番目の方法でいいでしょうし、 streamReaderなどではtry〜Finallyもつかうでしょう、 DBサーバへのコネクションなどではusingを使った方がいいでしょうし IDisposableを実装していないクラスにusingを使うことはできませんし だからといってなにもしないIDisposableを実装するのかと言えばそれは間違い出だと思います。 場合によってGetDataメソッドはstaticメソッドで済む場合もあったりしますし ケースバイケースなのでは? | ||||||||||||||||
|
投稿日時: 2009-02-07 13:12
Dispose されるかどうかの心配の前に、Dispose しなければならないかどうかを吟味してみては?
アンマネージ リソースを使わないなら、Dispose する必要はありません。 「Dispose されないのでは?」と書いてあるので、私も UI を持ったユーザー コントロールのことだと思いました。 | ||||||||||||||||
|
投稿日時: 2009-02-09 09:58
よねKENさん
デューンさん Jittaさん
今は自クラスのFinalizeを呼び出しています。 じゃあ、自クラスのFinalizeはと言うと特に記述はしていません。 クラスのメソッド内で、Try Catch Finallyでコネクションの切断、ファイルクローズなどは行っています。 なので、自作クラスのDisposeまたはFinalizeで必要な処理は自作クラスではほとんど無い?はずです。
そうでよね。。。
Disposeが必要かどうかはあまり考えずに、自作クラスには全てIDisposableを実装していました。 社内でDisposeする習慣を浸透させようとしての判断だったのですが。。。 必要がないのに、実装することは逆に使う側から見ると混乱を招くのかもしれませんね。。。反省 必要なところで必要な分だけ実装するのように心がけます。 |
1