Memory management 不要多次处理对象

Memory management 不要多次处理对象,memory-management,fxcop,.net,Memory Management,Fxcop,.net,似乎不明白为什么FXCop抱怨我不止一次地处理memoryStream对象。据我所知,我只是在最后一个街区处理它 完整错误消息为: CA2202不多次处理对象对象对象“memoryStream”可以在方法“MessageTransform.GetEnvelope(Message)”中多次处理。为了避免生成System.ObjectDisposedException,您不应该对一个对象多次调用Dispose。:Lines:48 Api MessageTransform.cs 48

似乎不明白为什么FXCop抱怨我不止一次地处理memoryStream对象。据我所知,我只是在最后一个街区处理它

完整错误消息为:

CA2202不多次处理对象对象对象“memoryStream”可以在方法“MessageTransform.GetEnvelope(Message)”中多次处理。为了避免生成System.ObjectDisposedException,您不应该对一个对象多次调用Dispose。:Lines:48 Api MessageTransform.cs 48

        var memoryStream = new MemoryStream();
        try
        {
            var messageBuffer = message.CreateBufferedCopy(int.MaxValue);
            var xPathNavigator = messageBuffer.CreateNavigator();

            var xmlWriter = XmlWriter.Create(memoryStream);
            xPathNavigator.WriteSubtree(xmlWriter);
            xmlWriter.Flush();
            xmlWriter.Close();

            memoryStream.Position = 0;
            var xdoc = XDocument.Load(XmlReader.Create(memoryStream));
            return xdoc;
        }
        catch (ApplicationException e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
        finally
        {
            memoryStream.Dispose();
        }
如果我在using块中包装相同的代码,我会得到相同的错误


这只是过度活跃的FXCop的问题,还是使用using块或.Dispose()不适用于System.IO.MemoryStream?

XmlWriter可以从其
关闭
方法中处理流,这就是规则所采用的方法。但是,此行为是有条件的,不应在按照您描述的方式为流创建的
XmlWriter
中调用。

正如Nicole所述,
XmlWriters的
Close
可以处理
Memorystream
-对象,这会导致引发错误

我想指出的是,
使用
语句和
try finally
语句是完全相同的。编译器在执行时将using语句转换为tryblock,并在finallyblock中转换为Dispose()

using (var memoryStream = new MemoryStream())
{
    var messageBuffer = message.CreateBufferedCopy(int.MaxValue);
    var xPathNavigator = messageBuffer.CreateNavigator();

    var xmlWriter = XmlWriter.Create(memoryStream);
    xPathNavigator.WriteSubtree(xmlWriter);
    xmlWriter.Flush();
    xmlWriter.Close();

    memoryStream.Position = 0;
    var xdoc = XDocument.Load(XmlReader.Create(memoryStream));
    return xdoc;
}