2014-05-13 34 views
1

似乎看不出为什么FXCop抱怨我多次丢弃memoryStream对象。据我所知,我只是把它放在最后一块。不要多次处理对象

完整的错误信息是:

CA2202不处置对象多次对象“的MemoryStream”可以设置比在方法“MessageTransform.GetEnvelope(消息)”一次。为了避免产生System.ObjectDisposedException你不应该调用Dispose多个时间上的对象:行:48个阿比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 (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; 
} 

这只是一个过度活跃的FxCop问题或不使用using块或.Dispose()有点不适用于System.IO.MemoryStream?

回答

1

XmlWriter可以处理来自其Close方法的流,这是规则正在采用的方法。但是,此行为是有条件的,不应在您为描述的方式为流创建的XmlWriter中调用。

1

正如Nicole所述,XmlWriters'Close可以配置Memorystream对象,这会导致错误发生。

我想指出,using声明和try-finally声明是完全相同的事情。编译器使用语句将语句转换为tryblock,并在finally块中使用Dispose()。