• ベストアンサー

Disposeはするべきですか?

Dim objForm as New Form1 objForm .ShowDialog() とフォームを開いた後、objForm.Dispose()と記述してフォームオブジェクトを解放するべきでしょうか? 解放するべきだとは思うのですが、色々な人のソースを見ると、そのようになっていないような気がするので…。

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

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

Disposeしなくても、大抵の場合は普通に動作するとは思いますが、 プログラミングのマナーとして(?)、最低限、Disposableなオブジェクトの インスタンスを明示的に作成したら、Disposeするクセをつけておいた方が、いいような気がします。 (ぶっちゃけ、DisposableなのにDisposeしていないのは手を抜いてるだけって気も…) あと、確かにNo.1で書かれてるUsingを使った記述も、そこを抜けたら勝手に Disposeされるので楽で良いです。 DataAdapterを使ったDBアクセスでエラートラップする場合なんかは特に…

その他の回答 (1)

  • unamana19
  • ベストアンサー率62% (56/89)
回答No.1

基本的には、解放はGC(ガーページコレクション)によって行われる ので、必要はないと思いますが、VB 2005を利用されている のであれば、Usingステートメントを利用することにより、 明示的に解放?が行われます。 Using frm As New Form1   frm..ShowDialog() End Using

関連するQ&A

  • Disposeの動き

    VB2010でプログラム開発を行っています。 VB2010は初心者で、インターネットを使って調べながら構築していますので、ほとんど意味を理解していない状態です。 この度下記の文を書いたのですが、Point1で「Cmd.Dispose() 」を入れないとPoint2で「OleDbException が発生しました エラーを特定できません」のエラーになってしまいます。 そこで2つの疑問が出てきたので教えていただけないでしょうか。 疑問1: なぜ、Point1でDisposeしないとエラーになってしまうのか。 疑問2: Point1でDisposeすると、内容が破棄されると思っていたのですが、そのまま処理が進むようです。 なぜ、再度「Dim Cmd As New OleDbCommand」の宣言が必要無く、トランザクションも続いているのでしょうか。 また、よりスマートな書き方があればご教授いただけるとありがたいです。 よろしくお願いします。 Module Module1   Public Con As New OleDbConnection   Public Cmd As New OleDbCommand   Public bTrans As OleDb.OleDbTransaction   Public sb As New System.Text.StringBuilder() End Module Private Sub Btn_Kanryo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Kanryo.Click   Dim ExResult AS Integer        '新規トランザクションの開始。        bTrans = Con.BeginTransaction        'コマンドオブジェクトにトランザクション関連付け        Cmd.Transaction = bTrans        'DB更新1        sb = New System.Text.StringBuilder        sb.AppendLine("UPDATE A ")        sb.AppendLine("SET")        sb.AppendLine(" A_AA = '1'")        sb.AppendLine(" WHERE")        sb.AppendLine(" A_BB='123'")        Cmd.Connection = Con        Cmd.CommandText = sb.ToString        ExResult = Cmd.ExecuteNonQuery()        'ストアドプロシージャ―処理        Cmd.Connection = Con        Cmd.CommandType = CommandType.StoredProcedure        Cmd.CommandText = "AAA.ABC"        Dim outPara As New OleDbParameter("ERR_FLG", OleDbType.Decimal)        outPara.Direction = ParameterDirection.Output        Cmd.Parameters.Add(outPara)        Cmd.ExecuteNonQuery() Point1⇒ Cmd.Dispose()        'DB更新2        sb = New System.Text.StringBuilder        sb.AppendLine("DELETE ")        sb.AppendLine(" B")        sb.AppendLine(" WHERE ")        sb.AppendLine(" B_AA='1'")        Cmd.Connection = Con        Cmd.CommandText = sb.ToString Point2⇒ ExResult = Cmd.ExecuteNonQuery()        bTrans.Commit() End Sub

  • Visual Studio 2005 C# フォームのせいでエラー?

    まず電話がかかってくると電話番号をもとに電話をかけてきたひとの情報をデータベースから取り出して表示するという簡素なウィンドウズプリケーションおVS2005,C#で書いてます。VSもC#使い始めて何週間かという初心者です。 メインのフォーム(フォーム1)があって、あるフォーム1にある値をユーザー変更するのに2つめのフォームをつかって入力できるようにしたのですが、閉じてから電話がかかってくるとbase.Dispose(disposing)というところでエラーになります(いつもここの個所がエラーになるみたいですが。。)。電話がかかってきて電話番号をしらべるときは、フォームにあるテキストボックスなどのコントロールやオブジェクトはクリアにしています。 2つめのフォームはフォーム1から Form2 form2 = new Form2(); form2.ShowDialog(this); で開いて フォーム2では (Form1)this.Owner)でフォーム1の値を変更したすぐに this.Dispose(); でフォーム2を閉じます。 試しにform2.Show(this);にして2つめのフォームを閉じないようにしたらエラーにはなりませんでした。 これだけの情報でわかるかどうかわかりませんが、フォーム2の扱いに問題あるのでしょうか? よろしくお願いします。

  • VC++:ダイアログがDispose()できない

    前略 ・.NET 2012のVC++を使っています。 ファイルをオープンするプログラムをつくろうとしています。その過程でダイアログをオープンするプログラムをネットにあったC#のコードを参考に、openFileDialog1->Dispose();をコメントアウトした以下に示すものをつくりました。このコードは特に問題なくコンパイルできて動作します。  しかし、C#のコードにあった openFileDialog1.Dispose();から変更したopenFileDialog1->Dispose();を追加すると "error C2039: 'Dispose' : 'System::Windows::Forms::OpenFileDialog' のメンバーではありません。"と云うエラーメッセージがでてコンパイルできません。 <質問>  VC++の場合 C#のopenFileDialog1.Dispose();に相当するオブジェクト破棄のコードは不要なのでしょうか?  もし、破棄が必要なのであればどのようなコードを書けばよいのでしょうか?  どなたかお分かりになる方、ご教示いただければ幸いです。 以上、よろしくお願いします。 //------------------------------------------------------- private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog();//new OpenFileDialog(); openFileDialog1->Title = "ダイアログのタイトルをココに書く"; openFileDialog1->InitialDirectory = "c:\\"; openFileDialog1->FileName = "初期表示するファイル名をココに書く"; if (openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK) MessageBox::Show(openFileDialog1->FileName); // 不要になった時点で破棄する (正しくは オブジェクトの破棄を保証する を参照) // openFileDialog1->Dispose(); };

  • Hideについて(.NET)

    Form1をHideで非表示にし、Form2を開いた後、再びForm1を表示したいのですがうまくいきません。 [form1のイベント] Dim frmForm2 as New Form2 frmForm2.Show Me.hide Sub End [form2のイベント] Dim frmForm1 as New Form1 frmForm1.Show Me.Close Sub End としてあります。 非表示されたフォームを再表示されずに、新しくフォームが開いてしまっていると考えられるんですが、どうしたらよいでしょうか? 

  • CloseとDisposeの違い

    みなさまこんばんわです。よろしくお願い申し上げます。 VB.NET 2008でコーディングしています。 CloseとDisposeの違いについて教えていただきたいのです。 これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。 たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。 これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。 そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。 ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。 わけわからなくなってきました。。。 ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。 ここで4つの仮説を立ててみました。 1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる 2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる 3. 呼び出し方ではなく、別の要因が存在する 4. 併記する必要がある場合がある Me.Close() Me.Dispose() または、 Me.Dispose() Me.Close() どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

  • [VB]親画面と子画面の画面サイズ最小化について

    VB2012でwindowsアプリの開発を行っております。 親フォームから子フォームをShowDialogで起動する画面があるのですが、 親フォームを最小化して、子フォームは通常サイズで表示させたいです。 以下のコードを実行すると、親と子の両画面が最小化されてしまいます。 どなたかご教授頂くと助かります。宜しくお願い致します。 ----------コード-------------- Private Sub 子フォーム起動_Click Me.WindowState = FormWindowState.Minimized Dim frm As New 子フォーム frm.ShowDialog(Me) frm.Dispose() End Sub

  • VBAのフォームについて

    今、悩んでいるというか、不思議に思っていることがあります。 ACCESS2003 VBAで、VBAコードでメインのフォームから、ある帳票フォームのインスタンスを作成しています。メインフォームのモジュールに以下のように記述し、 Dim 帳票1 as Form で、ボタンのクリックイベントで、 set 帳票1 = New Form_帳票の元フォーム とインスタンスを生成します。更に、この帳票フォームには、同様に子フォームを持っています。こちらも同様に帳票フォームモジュールに、 Dim 詳細1 as Form として、あるボタンのクリックイベントに、 set 詳細1 = New Form_詳細フォーム と、しています。ここで、帳票1の閉じるボタンを押しても、詳細1のフォームは、閉じません。 同様に、帳票の元フォームに Dim 帳票2 as form ボタンクリックで、 Set 帳票2 = New Form_帳票2の元フォーム とします。さらに帳票2の元フォームには、 Dim Child帳票 as Form ボタンクリックで、 Set Child帳票 = New Form_帳票2の元フォーム としています。 これで、Child帳票は、いくつもいくつもインスタンス化されます。そこで、今までの動作に準じて、たくさんあるChild帳票の大元を閉じると、こちらは子フォームが全部閉じます。例えば10個子フォームを作って、途中を閉じるとちゃんとその子だけが閉じます。最初の例の帳票1フォームを閉じても、詳細1フォームが閉じないのと、何が違うのか分かりません。私は、フォームが閉じるときには、そのメンバクラス(フォーム)は、破壊されるものだと思っていたのですが、そうでもないようです。どなたかわかりやすく、教えていただけないでしょうか?

  • DataGridVeweで質問です。

    DataGridVeweで質問です。 最近、VB.NETを勉強し始めたばかりの初心者です。 質問が2点あります。どなたかご教授お願いします。 フォーム1:検索用社員カナ(テキストボックス)       DataGridVewe       参照ボタン       DataGridVeweには、T社員マスタの社員コード、社員名、社員カナを表示。 フォーム2:フォーム1で選択されたデータの詳細を表示する。 (1)フォーム1で検索用社員カナに入力された時、T社員マスタをあいまい検索し、DataGridVeweのデータにカーソルを位置づけたい。  できれば、ENTERボタンで確定した時に検索処理を行いたい。 (2)DataGridVeweに表示したレコードの内容ををフォーム2で参照したいのですが、下記のとおり記述すると、  「オブジェクト参照がオブジェクト インスタンスに設定されていません。」のエラーが発生します。  DataGridVewe1.CurrentCellがNULLになっているのでそこが原因でしょうか?  どのように修正すればよいか教えて下さい。  お願いします。    <フォーム1でレコードを選択し、参照ボタン押下時> Private Sub BTN_参照_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_参照.Click Dim f As New フォーム2() ' モーダルフォームとして表示 f.ShowDialog() ' リソースを解放 f.Dispose() End Sub  <フォーム2のLoadイベント> Private Sub フォーム2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim f As New フォーム1() Dim strコード As String strコード = f.dgrSyain.Item(0, f.DataGridVewe1.CurrentCell.RowIndex).Value.ToString()←ここでエラー  TXT_社員コード.Text = strコード End Sub

  • vb2005で四角

    vb2005でformのload時に四角形を書く処理をしたいのですが ボタンの中にコードを書かないと作画しないのですが なにか方法がありますか。 現在のロジック form1.load Dim g As Graphics = PictureBox1.CreateGraphics() Dim p As New Pen(Color.Black, 1) g.DrawRectangle(p, 10, 20, 100, 80) p.Dispose() g.Dispose() end sub

  • C#でのフォーム間のデータの受け渡しについて

    フォーム間のデータ(パラメータ等)の受け渡しについて教えてください。 現在Form1からForm2を起動させる場合、以下のようにForm2のインスタンスの生成時のパラメータを設定してもForm2のLoadイベントでは拾うことはできないのでしょうか? ↓実際のコード //Form1クラスのインスタンスを作成する //引数(a,b) Form2 f = new Form2(a,b); //Form1を表示する //ここではモーダルダイアログボックスとして表示する //オーナーウィンドウにthisを指定する f.ShowDialog(this); //フォームが必要なくなったところで、Disposeを呼び出す f.Dispose(); また、上記の方法が違っていた場合、方法としてどのようなやり方があるのか教えてください。 よろしくお願いいたします。

専門家に質問してみよう