Vb.net RAII XmlWriter VisualBasic

Vb.net RAII XmlWriter VisualBasic,vb.net,raii,Vb.net,Raii,我只是在学VB,所以这可能是一个noob问题。事先道歉 我试图用一个类来包装一个XmlWriter,以管理内存、刷新、关闭等。。。这样客户就不用担心了 我的代码是: Option Explicit On Option Strict Off Imports System.Xml Imports System.IO Module MainModule Sub Main() Dim xmltest As XmlOutput = New XmlOutput("output.

我只是在学VB,所以这可能是一个noob问题。事先道歉

我试图用一个类来包装一个XmlWriter,以管理内存、刷新、关闭等。。。这样客户就不用担心了

我的代码是:

Option Explicit On
Option Strict Off

Imports System.Xml
Imports System.IO


Module MainModule
    Sub Main()
        Dim xmltest As XmlOutput = New XmlOutput("output.xml", "test")
        xmltest.writeData("hello", "19.95")
    End Sub
End Module

Public Class XmlOutput

    Private xmlWriter As XmlWriter

    Public Sub New(ByVal filename As String, ByVal calculator As String)
        xmlWriter = XmlWriter.Create(filename)
        xmlWriter.WriteStartDocument(True)
        xmlWriter.WriteStartElement(calculator)
    End Sub

    Protected Overrides Sub Finalize()
        xmlWriter.WriteEndElement()
        xmlWriter.WriteEndDocument()
        xmlWriter.Dispose()
    End Sub

    Public Sub writeData(ByVal head As String, ByVal value As String)
        xmlWriter.WriteElementString(head, value)
    End Sub
End Class
当我运行此命令时,会出现以下错误:

System.ObjectDisposedException was unhandled
  HResult=-2146232798
  Message=Cannot access a closed file.
  ObjectName=""
  Source=mscorlib
  StackTrace:
       at System.IO.__Error.FileNotOpen()
       at System.IO.FileStream.Flush(Boolean flushToDisk)
       at System.IO.FileStream.Flush()
       at System.Xml.XmlUtf8RawTextWriter.Close()
       at System.Xml.XmlRawWriter.Close(WriteState currentState)
       at System.Xml.XmlWellFormedWriter.Close()
       at System.Xml.XmlWriter.Dispose(Boolean disposing)
       at System.Xml.XmlWriter.Dispose()
       at XmlOutputTest.XmlOutput.Finalize()
  InnerException: 
这似乎是XmlWriter在关闭文件流之前关闭了文件流。由于XmlWriter负责文件流,我希望它知道文件流何时关闭

问题:

  • 为什么XmlWriter试图关闭它已经关闭的东西(或者可能我对堆栈跟踪的解释不正确)
  • 我需要做什么来解决这个问题

  • 这不是一个进步。您不能使用终结器,无法保证底层文件流尚未终结。好的,您现在可以:)改为实现IDisposable。通常,决定是否重写Finalize()非常简单。如果你认为它可能有用,那么99.9%的情况下你都是错的。谢谢Hans,如果你能提供一个链接来解释为什么会这样,我很乐意接受这个答案。另外:我的理解是iDisposable将内存管理的责任交给对象的客户端。在这种情况下,过度使用RAII是一种VB习惯用法吗?这不是一种改进。您不能使用终结器,无法保证底层文件流尚未终结。好的,您现在可以:)改为实现IDisposable。通常,决定是否重写Finalize()非常简单。如果你认为它可能有用,那么99.9%的情况下你都是错的。谢谢Hans,如果你能提供一个链接来解释为什么会这样,我很乐意接受这个答案。另外:我的理解是iDisposable将内存管理的责任交给对象的客户端。在这种情况下,使用RAII来实现这一点是不是一种VB习惯用法?