Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修复CA2202警告?_C# - Fatal编程技术网

C# 如何修复CA2202警告?

C# 如何修复CA2202警告?,c#,C#,下面是我用来解析XML的方法。它在代码分析中给出了CA2202警告,该警告表示对象mStream可以被多次释放,我不应该多次调用dispose。如何解决此警告 public static String PrintXML(String XML) { String result = ""; string[] xmlSeperators = new string[] { "<?" }; string[] splitResults = new

下面是我用来解析XML的方法。它在代码分析中给出了CA2202警告,该警告表示对象mStream可以被多次释放,我不应该多次调用dispose。如何解决此警告

public static String PrintXML(String XML)
    {
        String result = "";
        string[] xmlSeperators = new string[] { "<?" };
        string[] splitResults = new string[2];

        if (!String.IsNullOrEmpty(XML))
        {
            using (MemoryStream mStream = new MemoryStream())
            {
                using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
                {
                    XmlDocument document = new XmlDocument();
                    try
                    {
                        // Load the XmlDocument with the XML.
                        //Check if it is only XML 
                        if (XML.StartsWith("<?"))
                        {
                            document.LoadXml(XML);
                        }
                        else
                        {
                            //Split the string appended before XML
                            splitResults = XML.Split(xmlSeperators, 2, StringSplitOptions.None);
                            if (splitResults.Length > 1)
                            {
                                string d = "<?" + splitResults[1];
                                document.LoadXml(d);
                            }
                        }
                        writer.Formatting = Formatting.Indented;
                        // Write the XML into a formatting XmlTextWriter
                        document.WriteContentTo(writer);
                        //xx.WriteTo(writer);
                        writer.Flush();
                        mStream.Flush();
                        // Have to rewind the MemoryStream in order to read its contents.
                        mStream.Position = 0;
                        // Read MemoryStream contents into a StreamReader.
                        StreamReader sReader = new StreamReader(mStream);
                        // Extract the text from the StreamReader.
                        String FormattedXML = sReader.ReadToEnd();

                        if (splitResults[0] != null)
                        {
                            result = splitResults[0] + "\n" + FormattedXML;
                        }
                        else
                        {
                            result = FormattedXML;
                        }
                    }
                    catch (XmlException xe)
                    {
                        Log.Error(xe);
                        throw;
                    }                        
                }                   
            }
        }
        return result;
    }
公共静态字符串PrintXML(字符串XML)
{
字符串结果=”;

string[]xmlSeperators=new string[]{“您可以像另一个答案所说的那样抑制错误警告,但解决此问题的实际方法是实际调用
.Dispose()
方法仅在代码中出现一次,并且仅在您使用完该方法之后。如果您再次处理已处理对象,则会引发System.ObjectDisposedException异常,但不能确定。可以对对象多次调用正确的dispose方法,并且不会/可能不会为您生成错误。但不能保证这样做

微软的开发者网络文档中已经说明了解决方法

若要修复违反此规则的情况,请更改实现,以便无论代码路径如何,只为对象调用一次Dispose


更多信息:

当您使用
语句嵌套
时会发生这种情况,其中内部语句包含来自外部语句的资源。在这种情况下,
XmlTextWriter
将在处置
MemoryStream
时处置它,然后外部
using
语句将导致它被处置为第二次

您可以通过使用try/finally替换外部
语句来手动处理MemoryStream:

MemoryStream mStream = null;
try
{
    mStream = new MemoryStream();
    using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
    {
      mStream = null;
     ...
    }
}
finally
{
    if(mStream != null)
        mStream.Dispose();
}

(请参阅)

获得此警告的原因是
XmlTextWriter.Dispose()
将确保下面的
MemoryStream
对象也被处理。因此,当
MemoryStream
using
范围结束时,它将尝试处理
MemoryStream
对象,从而发出警告

using
block编译成一个
try finally
块。内部
在代码中使用
block将在
编写器上调用
Dispose
。这将在
内存流
对象
mStream
上调用
Dispose
。在控制从内部using块退出时,外部using块将尝试处置对象
writer
,但由于该对象已被处置,您将收到代码分析工具上的警告

要消除警告,您可以使用
语句删除第一个
,并使用
try finally
块。但请记住,在输入第二个
using
语句后,立即将
mStream
设置为
null

您的代码如下所示:

public static String PrintXML(String XML)
{
    String result = "";
    string[] xmlSeperators = new string[] { "<?" };
    string[] splitResults = new string[2];

    if (!String.IsNullOrEmpty(XML))
    {
        MemoryStream mStream  = null;
        try
        {
            mStream = new MemoryStream();
            using (XmlTextWriter writer = new XmlTextWriter(mStream, Encoding.Unicode))
            {
                mStream = null; // important 
                XmlDocument document = new XmlDocument();
                try
                {
                    // Load the XmlDocument with the XML.
                    //Check if it is only XML 
                    if (XML.StartsWith("<?"))
                    {
                        document.LoadXml(XML);
                    }
                    else
                    {
                        //Split the string appended before XML
                        splitResults = XML.Split(xmlSeperators, 2, StringSplitOptions.None);
                        if (splitResults.Length > 1)
                        {
                            string d = "<?" + splitResults[1];
                            document.LoadXml(d);
                        }
                    }
                    writer.Formatting = System.Xml.Formatting.Indented;
                    // Write the XML into a formatting XmlTextWriter
                    document.WriteContentTo(writer);
                    //xx.WriteTo(writer);
                    writer.Flush();
                    mStream.Flush();
                    // Have to rewind the MemoryStream in order to read its contents.
                    mStream.Position = 0;
                    // Read MemoryStream contents into a StreamReader.
                    StreamReader sReader = new StreamReader(mStream);
                    // Extract the text from the StreamReader.
                    String FormattedXML = sReader.ReadToEnd();

                    if (splitResults[0] != null)
                    {
                        result = splitResults[0] + "\n" + FormattedXML;
                    }
                    else
                    {
                        result = FormattedXML;
                    }
                }
                catch (XmlException xe)
                {
                    Log.Error(xe);
                    throw;
                }
            }
        }
        finally 
        {

            if (mStream != null)
            {
                mStream.Dispose();
            }

        }
    }
    return result;
}
公共静态字符串PrintXML(字符串XML)
{
字符串结果=”;

string[]XmlSeparators=new string[]{“不幸的是,XmlTextWriter没有得到与.NET 4.5()中StreamWriter相同的重载,因此您必须按照Habib所说的去做。通常我会做
new XmlTextWriter(new MemoryStream()),…
以明确XmlTextWriter拥有流——但实际上不适合您的示例,因为您是在创建XmlTextWriter后使用流的。感谢您的深入解释:)