【发布时间】:2010-12-21 20:51:58
【问题描述】:
Visual Studio 2010 Ultimate 中的运行代码分析命令在看到带有MemoryStream 和XmlTextWriter 的特定模式时会返回警告。
这是警告:
警告 7 CA2202:Microsoft.Usage: 对象 'ms' 可以被处理多个 一次方法 'KinteWritePages.GetXPathDocument(DbConnection)'。 为了避免产生 System.ObjectDisposedException 你 不应调用 Dispose 多个 对象上的时间。:行: 421 C:\Visual Studio 2010\Projects\Songhay.DataAccess.KinteWritePages\KinteWritePages.cs 421 Songhay.DataAccess.KinteWritePages
这是表格:
static XPathDocument GetXPathDocument(DbConnection connection)
{
XPathDocument xpDoc = null;
var ms = new MemoryStream();
try
{
using(XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8))
{
using(DbDataReader reader = CommonReader.GetReader(connection, Resources.KinteRssSql))
{
writer.WriteStartDocument();
writer.WriteStartElement("data");
do
{
while(reader.Read())
{
writer.WriteStartElement("item");
for(int i = 0; i < reader.FieldCount; i++)
{
writer.WriteRaw(String.Format("<{0}>{1}</{0}>", reader.GetName(i), reader[i].ToString()));
}
writer.WriteFullEndElement();
}
} while(reader.NextResult());
writer.WriteFullEndElement();
writer.WriteEndDocument();
writer.Flush();
ms.Position = 0;
xpDoc = new XPathDocument(ms);
}
}
}
finally
{
ms.Dispose();
}
return xpDoc;
}
此表单会产生相同类型的警告:
XPathDocument xpDoc = null;
using(var ms = new MemoryStream())
{
using(XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8))
{
using(DbDataReader reader = CommonReader.GetReader(connection, Resources.KinteRssSql))
{
//...
}
}
}
return xpDoc;
顺便说一句,下面的表格会产生另一个警告:
XPathDocument xpDoc = null;
var ms = new MemoryStream();
using(XmlTextWriter writer = new XmlTextWriter(ms, Encoding.UTF8))
{
using(DbDataReader reader = CommonReader.GetReader(connection, Resources.KinteRssSql))
{
//...
}
}
return xpDoc;
以上产生警告:
警告 7 CA2000: Microsoft.Reliability:方法中 'KinteWritePages.GetXPathDocument(DbConnection)', 对象 'ms' 并未全部处置 异常路径。称呼 System.IDisposable.Dispose 对象 'ms' 在所有对它的引用之前 超出范围。 C:\Visual Studio 2010\Projects\Songhay.DataAccess.KinteWritePages\KinteWritePages.cs 383 Songhay.DataAccess.KinteWritePages
除了以下之外,我还有哪些选择?:
- 禁止警告 CA2202。
- 禁止警告 CA2000 并希望
微软正在处理
MemoryStream(因为 Reflector 没有向我显示源代码)。 - 重写我的旧代码以识别
精彩的
XDocument和 LINQ to XML。
【问题讨论】: