如何处置XmlDocument

时间:2017-02-14 13:06:47

标签: c# .net xmldocument

我正在使用流创建一个XmlDocument并在XmlDocument中进行一些更改,并将XmlDocument保存到流本身。

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(fileStream);

////
////

////  
xmlDocument.Save(fileStream);
//how to dispose the created XmlDocument object.

现在我如何销毁XmlDocument对象?

3 个答案:

答案 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