- PR -

Dispose の意味が未だわからないのですが

投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2005/03/12
投稿数: 148
投稿日時: 2006-10-29 19:36
俺はC++のデストラクタ好きだな。
Disposeがあるかどうか調べなくていいし
いつ実行されるかわからないFinalizeじゃないし
自動で仮想になるとなおいいんだけど。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-10-29 20:41
引用:

ぼのぼのさんの書き込み (2006-10-29 18:59) より:

それに、Finalizeまで考えなきゃいけないのは、
自分でアンマネージドリソースを扱うクラスを作る場合ですよね。
既存のクラスを使う分には、
「お、このクラスにはDisposeがあるぞ。どれどれ仕様書を見てみよう。
 む、Closeもあるぞ。あ、でもこのクラスのCloseはDisposeと同じなのか。
 じゃあどっちか片方だけ呼んどきゃいいわけだ。せっかくだからUsing使うか」
ってレベルでいいと思うんですが。


同意。
_________________
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-29 21:11
引用:

StreamWriterのCloseはDisposeを呼び出すんですねぇ。



それ以外にも、StreamWriter.Close() には「元になるストリームの Close() を呼び出す」という副作用があります。

コード:
using (FileStream stream = new FileStream(適宜))
{
  using (StreamWriter writer = new StreamWriter(stream))
  {
    // 適宜

    writer.Close();
  }

  using (StreamWriter writer = new StreamWriter(stream))
  {
    // 適宜

    writer.Close();
  }

  stream.Close();
}



というコードを書くと、2個目のブロックが期待通りに動作しないことになります。

「Dispose 論」として語られている内容とは少し趣旨が違うかもしれませんが、たとえメソッド名が同じであっても、個々のクラスによってその実装はまるで違うことをきちんと意識するべきだという論拠になると思います。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-29 21:14
引用:

私は、基本的には
「new」したものは、必ず「delete」すべき
つまり「完全に管理すべき」だと思っています。



form1.Font = new Font(適宜);

とした時、new した Font はユーザコードで解放するべきでしょうか?

また、いきなり form1.Font プロパティに新しい Font を設定していますが、それ以前に form1.Font に設定されていた Font の解放は誰が行っている(行うべき?)でしょうか?
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2006-10-30 12:06
objectです。

>ぼのぼのさん
>うーん、これはC++的な考え方であって、#な考え方ではないですよね。
>なんてゆーか、オートマ車を運転してる人にクラッチの上手な使い方を力説してるような感じがします。
ソフトウエア上の問題を単純に「言語の問題」と考えるのは危険だと思います。
言語は「単なるツール」ではありませんから。
そして、私は
「言語だけの問題では無い」
と言っている訳です。
ここで問題になっている「dispose」の問題は、ライブラリ(フレームワーク)の問題だと思います。

私は、オブジェクト指向、つまり
「classによるインスタンス生成」を考える限り、
「インスタンスの寿命」=「いつ生成され、いつ廃棄されるか」
は重要なプログラミング要素だと思っています。
そして、
「ドメイン領域でのオブジェクトの寿命=重要な仕様の一部」
だと私は思います。

>それに、Finalizeまで考えなきゃいけないのは、
>自分でアンマネージドリソースを扱うクラスを作る場合ですよね。
先ず、「finalize」はインスタンス管理の本質ではありません。
「finalize」は、「GC」導入に伴って必要になった「単なるメソッド」だと思います。
そして、「GC」は本来「デストラクタ」の一部の機能であった
「実メモリの解放」
という作業をやっているだけです。
実メモリの解放と異なり「インスタンスの廃棄(インスタンス管理)」は、
「オブジェクト指向プログラミングに於いて本質である」
と言っても良いのではないでしょうか?
-----------------------------------
>渋木宏明(ひどり)さん
私の発言『「new」したものは、必ず「delete」すべき』は、
「newしたものは、必ずどこかでdeleteされている」
という象徴的な意味でのものでした。
「したものは・すべき」という言葉が、少し誤解を与える表現でした。
謝ります。
実際、あるオブジェクトが、「移譲」される状況を考えると
「new」する実体と「delete」する実体が異なるのは当然有り得る状況だと思います。

ただ、ご指摘の例は「移譲」その他と関連しているとは思いますが、
「現在のコード記述の曖昧さ」
にも関連した問題だと思います。
#私は「delete」を任せるのであれば、本来「new」も任せた方が良いと思います。
#しかし、この辺りは、現在のコード表記の不完全(未成熟)な部分と関わる問題だと思います。
ぼのぼの
ぬし
会議室デビュー日: 2004/09/16
投稿数: 544
投稿日時: 2006-10-30 23:18
えーっと… (;−−)
既にオートマ車を買って乗ってる人に対して、

 運転技術の問題を単純に「変速機構の問題」と考えるのは危険だと思います。
 変速機構は「単なるツール」ではありませんから。
 そして、私は
 「変速機構だけの問題では無い」
 と言っている訳です。
 ここで問題になっている「クラッチ操作」の問題は、自動車(4輪全般)の問題だと思います。

とか言われてもですね、
「いや、だから俺の車クラッチ無いんだよ。
 ギアだって1とか5とか無いの。
 『D』と『2』しか無いんだってば!」
っていう話で。

私は、「既にそこに在る」C#2005とVB2005という言語に関して、
「どう使うのが最も適切か」という現実的な話をしているのであって、
「それが本来どう在るべきか」という理想論を言及する気は無いのです。

それに関して個人的な時間と体力を費やしてこの場で追求する気は無いし、
このスレッドでそれをすることはスレ主さんの本意ではないと考えます。

悪しからず。
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2006-10-31 16:47
objectです。

少し補足します。

例えば、
「dispose」が関連するあらゆる状況が正しい
と前提し、
「その意味を理解出来ない自分がオカシイ」
と考えてしまう。
これが、現在の状況ではないでしょうか?

しかし、そうでは無く、
基本的な所に少し問題があり、
それをカバーする実際的な解決策が、
「dispose」
と考える事が大切だと思います。

それから、
問題が起きない努力を精一杯する事は最も大切だと思います。
しかし、何でも100%完全に対処出来る訳でもありません。
実際に起きている現実を素直に受け入れ、
それを誠実に乗り越えて行く事は
「PGにとって特に大切な態度」
だと思います。
#同じ問題を持っているのは「.NET」だけではありません。

以上の事項を少し考慮すれば、
もう少し心に余裕をもって
「dispose」
を眺める事が出来るのではないでしょうか?

他の方々が「dispose」に関して述べておられますが、
その意識のレベルは各々異なっても、
「余裕のある目で見ている事は間違いの無い事実」
だと思います。
#あくまで、私一人の見解ではありますが…。

兎に角、余り悩まない事を祈ります。
少しでも参考になれば幸いです。

[ メッセージ編集済み 編集者: object 編集日時 2006-10-31 16:57 ]
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-10-31 18:25
引用:

同意。



非同意

既存のクラスを使う場合、「Dispose() メソッドを持つかどうか(=IDisposable を継承しているかどうか)」は、最初に注目するべきポイントでは無いと思います。

Close() を呼び出すのは「アンマネージリソースを解放するため」ではなく、「Close() を呼び出すことがそのクラスの使い方の一部」であるからです。

ま、結果として得られるコードは同じようなモンなわけですが。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-10-31 20:05 ]

スキルアップ/キャリアアップ(JOB@IT)