dポイントプレゼントキャンペーン実施中!

毎々参考にさせていただいております。
早速ですが質問させていただきます。

あるフォームでボタンが押された時に、下記の3つの処理でログを出力したい場合なのですが。
 a) ボタンが押されたイベント処理
 b) ボタンが押されたイベント処理の中で呼ばれるTestFunction1の中
 c) ボタンが押されたイベント処理の中で呼ばれるTestFunction2の中
複数のメソッドに参照されるということで、StreamWriterのオブジェクトはインスタンスフィールドに宣言しています。

Public Class Test
  'StreamWriter型のフィールド宣言
  Private _sw As System.IO.StreamWriter

  'ボタンクリックイベント処理
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Me._sw = New System.IO.StreamWriter(filePath)
    Using Me._sw
      Me._sw.WriteLine("Button1はクリックされました")
      Me.TestFunction1()
      Me.TestFunction2()
    End Using
  End Sub

  Private Sub TestFunction1()
    'TODO:ここに処理
    If Me._sw IsNot Nothing Then
      Me._sw.WriteLine("TestFunction1は処理されました。")
    End If
  End Sub

  Private Sub TestFunction2()
    'TODO:ここに処理
    If Me._sw IsNot Nothing Then
      Me._sw.WriteLine("TestFunction2は処理されました。")
    End If
  End Sub
End Class

目的とする処理は実現されているのですが、このようなUsingの使い方は問題ないのでしょうか?
どなたかに御回答いただければうれしく思います。よろしくお願いいたします。
環境は下記のような感じです。
 環境IDE:Visual Studio 2005
 言語  :Visual Basic

A 回答 (2件)

 StreamWriterやGraphicsなども、Application終了後にガベージコレクターに引っ掛かり、最終的には .Net がメモリを解放するはずなのですが、これらはリソースの消費が激しいので、Application内で何回も作成されることを防ぐために、まめに Usingブロックか、Disposeメソッドでメモリを掃除しろ、というのがMSの推奨です。



 _swは、使い切ってから End Using に達するので、問題ないように思えます。ただ蛇足ですが、_swがNothingでないかどうかだけで、所定の機能が果たせた、という判断は若干疑問です(大きなお世話ですね)。

この回答への補足

ddtddtddtさん、早速の御回答ありがとうございます。
Usingの使い方として、

Private Sub TestFunction3()
  Using sw As System.IO.StreamWriter = New System.IO.StreamWriter(filePath)
    sw.WriteLine("テスト")
  End Using
End Sub

というように、ローカルで宣言してその場で使い、メソッドをまたぐ様な使い方をしたことがなかったため、
質問内容のような書き方がありなのか??と思った次第です。
一応、質問内容のような場合とローカルのみで使う場合の両方のケースで、Usingブロックを抜けたあとの
StreamWriterオブジェクトの様子をウォッチで確認したところ、両方のケースで同じように動いていました。
(と思われます)

>ただ蛇足ですが、_swがNothingでないかどうかだけで、所定の機能が果たせた、という判断は若干疑問です。
これについてですが、いつもこのように処理してしまっているのですが・・・。私の勉強不足です。
勉強になりました。御回答ありがとうございました。

補足日時:2008/03/06 17:29
    • good
    • 0

swは生存期間がButton1_Click内なので、Button1_Clickの外の変数にするのは頂けない。


swはButton1_Clickのローカル変数として、他のメソッドには引数で渡せばよい。
    • good
    • 0
この回答へのお礼

>swは生存期間がButton1_Click内なので、Button1_Clickの外の変数にするのは頂けない。
>swはButton1_Clickのローカル変数として、他のメソッドには引数で渡せばよい。
おっしゃるとおりです。御指摘ありがとうございました。

お礼日時:2008/03/10 08:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!