ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-MemoryStream,XmlTextWriter和警告4 CA2202:Microsoft.Usage

2019-10-23 17:04:45  阅读:170  来源: 互联网

标签:dispose linq xml c


当看到带有MemoryStream和XmlTextWriter的特定模式时,Visual Studio 2010 Ultimate中的“运行代码分析”命令将返回警告.

这是警告:

Warning 7 CA2202 : Microsoft.Usage :
Object ‘ms’ can be disposed more than
once in method
‘KinteWritePages.GetXPathDocument(DbConnection)’.
To avoid generating a
System.ObjectDisposedException you
should not call Dispose more than one
time on an object.: Lines:
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;

上面产生警告:

Warning 7 CA2000 :
Microsoft.Reliability : In method
‘KinteWritePages.GetXPathDocument(DbConnection)’,
object ‘ms’ is not disposed along all
exception paths. Call
System.IDisposable.Dispose on object
‘ms’ before all references to it are
out of scope. C:\Visual Studio
2010\Projects\Songhay.DataAccess.KinteWritePages\KinteWritePages.cs 383 Songhay.DataAccess.KinteWritePages

除了以下内容,我还有哪些选择?

>禁止警告CA2202.
> Supress警告CA2000,并希望
微软正在处置
MemoryStream(因为
Reflector没有显示源代码.
>重写我的旧代码以识别
很棒的XDocument和LINQ
XML.

解决方法:

首先,永远不要使用新的XmlTextWriter().从.NET 2.0开始不推荐使用.请改用XmlWriter.Create().

其次,对ms的分配应在using块中:

using (var ms = new MemoryStream())
{
    using (var writer = XmlWriter.Create(ms))
    {
        // ...
    }
}

我相信警告是正确的.可以在处理XmlTextWriter时处理MemoryStream,然后在“ finally”块中再次处理.

标签:dispose,linq,xml,c
来源: https://codeday.me/bug/20191023/1914487.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有