我正在使用流创建一个XmlDocument并在XmlDocument中进行一些更改,并将XmlDocument保存到流本身。
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(fileStream);
////
////
////
xmlDocument.Save(fileStream);
//how to dispose the created XmlDocument object.
现在我如何销毁XmlDocument对象?
答案 0 :(得分:2)
首先,您不应该重复使用这样的流。你真的想长期保持外部资源的开放吗?你会在重新保存xml之前寻找流吗?如果它比之前更短,你会在保存后截断流吗?
如果由于某种正当的理由答案是正确的,请改为使用XML操纵器类:
public class MyXmlManipulator : IDisposable
{
private FileStream fileStream;
// ...
public void ManipulateXml()
{
// your original codes here...
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~MyXmlManipulator()
{
Dispose(false);
}
protected virtual Dispose(bool disposing)
{
fileStream.Close();
// etc...
}
}
但基本上我会说不要保留对文件流的长期引用并重新使用它。相反,只在本地使用流并尽快处理它们。这里你可能需要的只是一个文件名。
public class MyXmlManipulator
{
private string fileName;
// ...
public void ManipulateXml()
{
XmlDocument xmlDocument = new XmlDocument();
using (var fs = new FileStream(fileName, FileMode.Open)
{
xmlDocument.Load(fs);
}
// ...
// FileMode.Create will overwrite the file. No seek and truncate is needed.
using (var fs = new FileStream(fileName, FileMode.Create)
{
xmlDocument.Save(fs);
}
}
}
答案 1 :(得分:1)
XmlDocument
课程未实施IDisposable
,因此无法强迫它随意释放资源。{0}}如果您需要释放该内存,那么唯一的方法就是xmlDocument = null;
,垃圾收集将处理其余内容。
答案 2 :(得分:0)
无法处理XmlDocument,因为它没有实现IDisposable。 真正的问题是你为什么要破坏这个对象?
我没有保留对垃圾收集器将摆脱它的对象的引用。
如果你想让进程更快,你可以做的唯一事情就像Fildor所说的那样,将对象设置为null