
毎々参考にさせていただいております。
早速ですが質問させていただきます。
あるフォームでボタンが押された時に、下記の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
No.1ベストアンサー
- 回答日時:
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でないかどうかだけで、所定の機能が果たせた、という判断は若干疑問です。
これについてですが、いつもこのように処理してしまっているのですが・・・。私の勉強不足です。
勉強になりました。御回答ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
InvalidateRectがうまくいかない
-
ACCESS側からEXCELの書式を設定...
-
ASP VBScriptでスクリプト実行...
-
エクセルが勝手に立ち上がる
-
逆コンパイルと逆アセンブルの...
-
Macターミナルで実行中のプログ...
-
powershell を使いカレントディ...
-
アプリケーションが終了するま...
-
COBOLのS9タイプからXタイプへ...
-
.NetのBackgroundWorkerクラス...
-
メモリが不足しています(VBA)
-
スレッドにて同一メモリの書き...
-
プロセスIDからウィンドウハ...
-
openGLで物体を半透明にして表...
-
フレームワーク「4.8.1」で、[S...
-
OSPFでプロセスを分ける意義に...
-
if ( a & b == b )
-
CWnd::OnTimerのスレッドの取得
-
Winsockで接続待ちタイムアウト...
-
C言語からC#への変換ツール
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
PostMessageの連続送信
-
エクセルVBAでクリップボード内...
-
VBA、UserFormを前面に出力して...
-
ファンクションキーのキャンセ...
-
Application.ScreenUpdating=Fa...
-
【MFC】イベントの無効化について
-
VBA kernel32 の意味
-
マウスのクリックを無視したい
-
ループを使わずに、特定時間に...
-
Excel VBA 自動的に閉じるMsgBox
-
「キャンセル」ボタン付きの処...
-
シャットダウン時のExcel強制終...
-
OSシャットダウン時の常駐アプ...
-
VB.NETで数秒間msgboxの...
-
VB6 コマンドボタン クリック...
-
Excel VBA 実行中に一瞬フリー...
おすすめ情報