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