Vb.net RAII XmlWriter VisualBasic
我只是在学VB,所以这可能是一个noob问题。事先道歉 我试图用一个类来包装一个XmlWriter,以管理内存、刷新、关闭等。。。这样客户就不用担心了 我的代码是: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.
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负责文件流,我希望它知道文件流何时关闭
问题:
这不是一个进步。您不能使用终结器,无法保证底层文件流尚未终结。好的,您现在可以:)改为实现IDisposable。通常,决定是否重写Finalize()非常简单。如果你认为它可能有用,那么99.9%的情况下你都是错的。谢谢Hans,如果你能提供一个链接来解释为什么会这样,我很乐意接受这个答案。另外:我的理解是iDisposable将内存管理的责任交给对象的客户端。在这种情况下,过度使用RAII是一种VB习惯用法吗?这不是一种改进。您不能使用终结器,无法保证底层文件流尚未终结。好的,您现在可以:)改为实现IDisposable。通常,决定是否重写Finalize()非常简单。如果你认为它可能有用,那么99.9%的情况下你都是错的。谢谢Hans,如果你能提供一个链接来解释为什么会这样,我很乐意接受这个答案。另外:我的理解是iDisposable将内存管理的责任交给对象的客户端。在这种情况下,使用RAII来实现这一点是不是一种VB习惯用法?