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 部分)我意识到这是一个简单的问题。

有没有更好的方法来实现日志记录机制?(第一季度第 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 回答