0

共有変数を使用してロギング機能を実装することを計画しています。以下のコードをご覧ください。

Imports System.IO

Public Class TestClass

    Public Shared objError As New StreamWriter("C:\Test.txt")

End Class

 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Try
            TestClass.objError.WriteLine("Error 1")
            TestClass.objError.WriteLine("Error 2")
            TestClass.objError.WriteLine("Error 3")
            'TestClass.objError.Close()
            TestClass.objError.WriteLine("Error 4")
            TestClass.objError = Nothing
        Catch ex As Exception

        End Try
    End Sub

この共有変数がどのように作成および破棄されるのかわかりません(form_loadの前に作成され、form_unloadによって破棄されると思います)。また、静的変数への参照をNothingに設定できる理由もわかりません。確かに、変数はプログラムが終了するまで存在する必要がありますか?(Q1、パート1)これは簡単な質問だと思います。

ロギングメカニズムを実装するためのより良い方法はありますか?(Q1パート2)。ロギングメカニズムは、エラーとログエントリを書き込みます。

更新私はここで私の答えを見つけたと思います:http://msdn.microsoft.com/en-us/library/z2cty7t8.aspx。「静的変数は引き続き存在し、最新の値を保持します。次にコードがプロシージャを呼び出すとき、変数は再初期化されず、割り当てられた最新の値を保持します。静的変数は、それが定義されているクラスまたはモジュールの存続期間。」

これがロギング機能を作成するための最良の方法であると私は確信していません。したがって、私の質問のパート2はまだ開いています。

4

2 に答える 2

2

変数用に予約されたメモリ領域Public Shared objErrorと、作成されてこの領域に割り当てられたオブジェクトのインスタンスを混同していますAs New StreamWriter("C:\Test.txt").

変数 を宣言するobjErrorと、コンパイラは必要なメモリを予約しますが、有効な値 (オブジェクトのインスタンス) を格納しません。StreamWriter のオブジェクト インスタンスでこの領域を初期化
するNewコマンドです。

変数に値Nothingを代入すると、StreamWriter のインスタンスが消去されますが (実際には明示的に Flush と Close を呼び出すことを好みます)、Shared 変数用に予約されたメモリ領域は削除されません。

ログについて。「どちらが最善の方法ですか」と尋ねると、推奨されているように外部コンポーネントを使用するのが最善の方法です。より優れたログ システムを作成することは非常に困難です。log4net は試行およびテストされており、無料であり、最良のシステムと見なされています。

于 2012-05-28T19:48:55.383 に答える
1

パート 2 への回答として、log4netまたはその他のロギング フレームワークを使用することをお勧めします。ASP.NET Health Monitoringを介してエラーをキャプチャすることもできます。しかし、それは通常のロギング機能ではありません。

于 2012-05-28T19:20:13.567 に答える