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