オブジェクトの破棄方法とタイミングについて

このQ&Aのポイント
  • C#やVBにおけるオブジェクトの破棄方法とタイミングについて教えてください。
  • フォームに配置されたオブジェクトの破棄やdispose処理について悩んでいます。質問ボタンや閉じるボタンなどのタイミングでどのように処理すれば良いか教えてください。
  • オブジェクトの破棄方法についてわからない点があります。フォームを閉じる際やボタン操作のタイミングでのdispose処理について教えてください。
回答を見る
  • ベストアンサー

オブジェクトをどこでdisposeするか

オブジェクトをどこで破棄するか こんにちは。C#もしくはVBについてお教え下さい。オブジェクトの破棄をどこですればいいかわからなく、悩んでいます。 フォームには下記のオブジェクトが配置されています。 ・データグリッドビュー ・検索ボタン ・閉じるボタン 動作は下記のようになります。 ・フォームをロード時、データベースにアクセス。データテーブルにデータをセット。グリッドビューに表示。 ・検索ボタン。データベースにアクセス。データテーブルにデータを再びセット。グリッドビューに表示。 ・閉じるボタン。フォームを閉じる。 ・DataTable、DataAdapter、sqlConnectionなどの変数は使い回しています。 質問: これらのオブジェクトを破棄、disposeするのは、どのタイミングですれば良いでしょうか? 閉じるボタンを押された時でしょうか?またフォームの右上にバッテンマークがありますが、これが押された時もdispose処理を入れておいたほうがいいのでしょうか? またはフォームを閉じた時は自動で破棄してくれるのでしょうか? 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

書かれているうちで,手動によるDispose対象になるのはSqlConnectionだけですね。 コントロールは親がDisposeされるとそのままDisposeされるので。 で,IDisposableなインスタンスが自分の管理下にある場合, ・不要になったらDisposeを呼び出す ・IDisposableなインスタンスは必要最小限の範囲で使う のがよいと思います。 SqlConnectionに関しては,コネクションプーリングに任せて必要な時のみ開いて閉じればよいでしょう。 # SqlConnectionに関して,Poolingはデフォルトtrue。 このため, using (var connection = new SqlConnection(connectionString)) { connection.Open(); /* DataAdapter使ってDataTableに値を流し込む */ } と,単一メソッドの中で開いて閉じることになります。

mellow91
質問者

お礼

遅くなりましたが、ご回答ありがとうございました。大変参考になりました!

その他の回答 (1)

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

C#は基本的にメモリ管理は自分でやらず、システムに自動でやってもらいます。 でも、フォームに関しては、使わなくなった時点で、明示的にdisposeしたほうが良いというのを見た気がします。 でも、私が以前創ったプログラムは、システムにお任せしました。

mellow91
質問者

お礼

遅くなりましたが、ご回答ありがとうございました。大変参考になりました!

関連するQ&A

  • 読み込んだデータを他のフォームで編集したい

    VB.netを勉強しはじめたばかりなので教えて下さい。 お願いします。 フォームにSQLのデータをデータグリッドビューで読み出しました。 選んだデータを編集ボタンを押すと新しいフォームが出てきて編集できるようにしたいのですが、どのようにやれば良いのかよくわかりません。 SQLにあるデータはテーブルが一つだけあって テーブル名:test 列名1:namecode(主キー) 列名2:name これを読み出して編集したいだけです。 データグリッドビューには読みだせたのですが、ボタンを押した時に選ばれたデータが新たに表示されるフォームの中(テキストボックス)へセットしたいのですが、どのようにすれば良いのか教えてください。 わかりやすいサイトがあれば教えていただければ幸いです。 よろしくお願いいたします。

  • VB DB更新時にパラメーターへ値のセット

    データベースの更新についてご指導下さい。 VB2010からSQLサーバーのデータベースに接続しております。 dataAdapter.Updateによりデータベースを更新する際の パラメーターへ値をセットする方法を教えて下さい。 テーブル名Test Code Name ------------ A   Suzuki 希望する処理 テキストボックスに入力された名前に変更 例) Suzuki → Yamada ○フォームの変数として定義 Dim dataAdapter As New SqlDataAdapter Dim dataSet As New DataSet ○FormLoad時にSelectCommandとUpdateCommandを設定 Dim SQL As String = "" Dim command As SqlCommand Dim connection As SqlConnection = New SqlConnection(~) SQL = "SELECT * FROM Test WHERE Code = @code " command = New SqlCommand(SQL, connection) dataAdapter.SelectCommand = command dataAdapter.SelectCommand.Parameters.Add("@code", SqlDbType.Char) SQL = "UPDATE Test SET Name = @name WHERE Code = @code" command = New SqlCommand(SQL, connection) dataAdapter.UpdateCommand = command dataAdapter.UpdateCommand.Parameters.Add("@code", SqlDbType.Char) dataAdapter.UpdateCommand.Parameters.Add("@name", SqlDbType.Text, 50) ○データ表示時にはこれで表示されました。 dataAdapter.SelectCommand.Parameters.Item("@code").Value = ComboBoxCode.text dataAdapter.Fill(dataSet) ○このSelectCommandを参考にこのように書いて見たのですが更新されません。 dataAdapter.UpdateCommand.Parameters.Item("@code").Value = ComboBoxCode.Text dataAdapter.UpdateCommand.Parameters.Item("@name").Value = TextBoxName.Text dataAdapter.Update(dataSet) どのようにしたら実行時にパラメーター化したところへデータをセットできるのでしょうか? データセットに値が入っていないのでは?と予想したのですが…。

  • DataSetの複数テーブルをひとつのDataGridViewでまとめて出したい

    こんにちは、いつも参考にさせていただいています。 VS2005のC#で制作しているのですが、 ひとつのデータセットの中に3つのテーブルがあります。 そのテーブル全てをデータグリッドビューでだしたいのですが、 ひとつのテーブルしか上手に出ません。 3つのテーブルをひとつのグリッドビューに出す方法を教えてください。 現状は以下のコードで一つのテーブルだけ表示しています。 dv = new DataView(dataset.Tables["data"], "", "", DataViewRowState.CurrentRows); dataGridView1.DataSource = dv;

  • Datagridviewで例外

    データベースよりデータ抽出しDatatableにセットしデータグリッドビューのDatasourceにセットしてデータ表示しております。 以下のような制御を実施するとデータが表示されない事象が致しました。 大変お手数お掛けいたしますが何か解決策が分かる方がいらっしゃいましたらご教授頂けないでしょうか。 (1)データベースよりデータ抽出しDatatable(dt1)にセット (2)データグリッドビューのDatasourceにセット→データが表示される (3) (1)のデータテーブルにDatatable.Select(抽出条件) (4)別のデータテーブル(dt2)に(3)の結果をCopyToDataTable (5)データグリッドビューのDatasourceにセット→何も表示されない

  • Accessで作成したテーブルのOLEオブジェクトの使い方

    Accessで作成したテーブルにデータ型(OLEオブジェクト型)で画像を取り込みできるようにしました。 取り込みした画像を開くためのフォームを作成して画像を開けるようにしました。 下記の内容です。 Private Sub Form_Open(Cancel As Integer) Form.Caption = ProgName End Sub しかし「ビットマップ形式」ですと問題なく開くのですが、「JPG形式」ですと開けないのです。取り込みしたAccessテーブルのフィールドから直接だとひらけます。 Accessで作成したフォームから、「JPG形式」の画像を開くにはどうすればよろしいですか? また、画像を1000件ほど取り込みすると大きいデータベースになってしまいます。Accessのデータベースのサイズは制限があるのかしら? アドバイスいただけれは幸いです。

  • サブフォームの表示の種類をVBAで操作したい

    こんばんは。 アクセスのフォームの中にサブフォームを入れていて コマンドボタンを押すたびに そのサブフォームを フォームビューか、 データシートビューか、 ピボットテーブルビューかに切り替えたいのですが VBAで可能でしょうか? 宜しくお願い致します。

  • ASP C#

    単純にデータベースから取得した物をフォームのTEXT_BOXに表示させたいのですがやり方がわかりません。 グリッドビューに結果をそのままバインドするのはわかるのですが。。。 select 品名 from 商品テーブル where ID = 3 など、結果が必ず1件のものです SqlConnection cn = new SqlConnection(@"Server=*****;Database=*****;User ID=***; Password=***;"); SqlCommand cmd = new SqlCommand("select title from mst_table where id = 1", cn); cn.Open(); このあと text_box.text = 結果; としたいんです。。。

  • このオブジェクトには、オートメーションオブジェクト

    アクセス2010です。 アクセスでフォームにはめ込んでいるサブフォームのデータをフィルタしようとすると ---------------------------------------------------------------------------- このオブジェクトには、オートメーションオブジェクト’カテゴリ’は含まれません。 オブジェクトのプロパティを設定するか、 メソッドを実行するVisual Basicプロシージャを実行しようとしましたが これらのプロパティまたはメソッドが使用できません。 オートメーションオブジェクトでサポートされているプロパティまたはメソッドについては、 コンポーネントのドキュメントを参照してください。 ---------------------------------------------------------------------------- と言うエラーになります。 フォームにカテゴリと言うフィールドは紐づけてないのですが なぜこのエラーが発生するのでしょうか?

  • アクセスのフィルタ

    アクセスを起動時設定により、データベースビュー出来ないようにしています。 フォームでフィルターをかける必要がでたので、調べていたら、起動時フィルタボタンを表示させようとすると、データベースビューのボタンも選択できるようになってしまいます。 フィルタだけが選択できるようには、出来ないんでしょうか?

  • ACCESS 不要なオブジェクトの削除

    お尋ねします。 ACCESS初心者です。 OSはXPのPRO、ACCESSは2003を使っています。 いろいろ試行錯誤しながらDBを作成しているうち、テーブルやクエリなどのオブジェクトがかなりたまってしまいました。 パフィーマンスを上げるため、DBを整理して不要なオブジェクトを削除したいのですが、分析方法がわかりません。 テーブルとクエリはリレーションを見ればつながりがわかるのですが、フォームやレポートなどはひとつひとつデータソースを調べるしかないのでしょうか? どなたか教えてください。

専門家に質問してみよう