none
dispose RRS feed

  • 質問

  • VB2005Windowsアプリです。

    Form_Loadに次のように記述したとき、なぜ例1はよくて例2が悪いのか、わかりません。

    DataTableのクローンが渡されるのでしょうか?わたしがDisposeをよくわかってないかも。

    よろしくお願いします。

    '例1
            Dim dt As New DataTable

            dt.TableName = "X"

            dt.Columns.Add("A")
            dt.Columns.Add("B")

            Dim dr As DataRow = dt.NewRow
            dr.Item(0) = "AAA"
            dr.Item(1) = "BBB"

            dt.Rows.Add(dr)

            Me.DataGridView1.DataSource = dt

            dt.Dispose()’ディスポーズ

    '例2
            Dim p As New PictureBox
            p.Image = Image.FromFile("C:\test.jpg")

            Me.Panel1.Controls.Add(p)
            p.Visible = True

            p.Dispose()’ディスポーズ

    2007年2月23日 14:07

回答

すべての返信

  • おっちいさん、こんにちは。

    これは、誰かからの課題でしょうか?
    そのように見えますので、ヒントだけ書きます。

     おっちい さんからの引用
    Me.DataGridView1.DataSource = dt

    ここに注目しましょう。
    参照型の基本についても確認しましょう。
    この状態で、Dispose メソッドを呼び出すとどうなるかわかりますよね。

    2007年2月23日 15:14
  • じゃんぬねっとさん、こんにちは。

     じゃんぬねっと さんからの引用

    これは、誰かからの課題でしょうか?

    あ、いえいえ、私がここのMSDNフォーラムを徘徊していて、思った疑問です。(^^;

     じゃんぬねっと さんからの引用

     おっちい さんからの引用
    Me.DataGridView1.DataSource = dt

    ここに注目しましょう。
    参照型の基本についても確認しましょう。
    この状態で、Dispose メソッドを呼び出すとどうなるかわかりますよね。

    う~ん。これって参照型ですよね?私の理解では、DisposeするとDatasourceも参照先がなくなって、と思ったのですが、この後、別のボタンクリックイベントなどで、Me.DataGridView1.DataSourceと参照してもNothingでないことが、私にはわからないんです。

    参照型の説明してあるサイトは、よく、値型では代入したあと元を変えても代入先は変わらない、参照型では代入先も変わる、というような説明がしてありますが、それは理解してるつもりです。

    わたしが何か勘違いしてますでしょうか?

    もうちょっと調べてみます。

    2007年2月23日 15:41
  • 例2のControls.AddでControlsからPictuerBoxが参照されるようになると解釈してますが、それは合ってますでしょうか?

     

    2007年2月23日 17:50
  • 例2 に相当するのは,例1 の場合だと

     Me.DataGridView1.Dispose()

    のような...?
    これなら例2と同じようにForm上に表示されないですよね。

     

    追記: 例2 は,あくまでふつうはの例で,
    ただ単に例1が不思議だということだということですよね。

    2007年2月23日 19:21
  •  稍丼 さんからの引用

    例2 に相当するのは,例1 の場合だと

     Me.DataGridView1.Dispose()

    のような...?
    これなら例2と同じようにForm上に表示されないですよね。

     

    そうですね。

     稍丼 さんからの引用

    追記: 例2 は,あくまでふつうはの例で,
    ただ単に例1が不思議だということだということですよね。

    そうです。まったくそのとおりです。

    DataTableってなにか違うのかな。???

    2007年2月24日 1:42
  • 想像ですが、DataTableはDisposeで何もしてないんじゃないかと思います。ウインドウハンドルなんかの解放すべきリソースを持ってなさそうですし・・・
    2007年2月24日 1:44
    モデレータ
  •  trapemiya さんからの引用

    想像ですが、DataTableはDisposeで何もしてないんじゃないかと思います。ウインドウハンドルなんかの解放すべきリソースを持ってなさそうですし・・・

    たしかに、DataTableって単なるデータの集合って感じで、開放すべきリソースはなさそうな気がします。で、Disposeで何もしてないとすると話は合うのですが、じゃぁ、なぜDisposableなのか?って疑問が。

    このクラスは解放すべきリソースを持っているか、持っていないか、とか常に気をつけておかねばいけないのでしょうか?

    で、それとは関係なくDisposeメソッドはあったりするってことでしょうか?

    2007年2月24日 2:18
  • この辺りが参考になりそうです。

    Disposeについて
    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=7&topic=21521

    2007年2月24日 2:29
    モデレータ
  • trapemiyaさん、ありがとうございます。

    私は今までDatatableはDisposeしてこなかったのですが、まぁそれでよし、とします。

    回答してくださった皆さん、考えてくださった皆さん、ありがとうございました。

    2007年2月24日 2:59