每次在visual studio 2015上,当我运行Code Analysis
时,都会有一些恼人的警告。所有这些都是这样的方法:
这是我的方法:
public static JObject ReadJson(string file_path)
{
try {
JObject o1 = JObject.Parse(File.ReadAllText(file_path));
using (StreamReader file = File.OpenText(file_path))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
return (JObject)JToken.ReadFrom(reader);//the warning is here
}
}
}
catch
{
return default(JObject);
}
}
为什么会出现这种警告?怎么解决?而最重要的是什么 我这个方法的错在我看来非常完美
警告说明
严重级代码描述项目文件行警告CA2202: Microsoft.Usage:对象'文件'可以多次处理 方法'JsonHelper.ReadJson(string)'。为了避免产生 System.ObjectDisposedException你不应该调用Dispose 一次在一个物体上。
答案 0 :(得分:2)
嵌套使用语句(在Visual Basic中使用)可能会导致违规 CA2202警告。如果是嵌套内部的IDisposable资源 using语句包含外部using语句的资源, 嵌套资源的Dispose方法释放包含的内容 资源。当出现这种情况时,外部的Dispose方法 using语句尝试再次处置其资源。
<强>问题:强>
using (StreamReader file = File.OpenText(file_path))
{
using (JsonTextReader reader = new JsonTextReader(file))
{
return (JObject)JToken.ReadFrom(reader);//the warning is here
} //"file" will be disposed here for first time when "reader" releases it
} //and here it will be disposed for the second time and will throw "ObjectDisposedException"
<强>解决方案:强>
你需要这样做(当一切正常时将对象放在 finally 块中,或者在发生错误时在catch块中处理):
public static JObject ReadJson(string file_path)
{
StreamReader file = null;
try {
JObject o1 = JObject.Parse(File.ReadAllText(file_path));
file = File.OpenText(file_path);
using (JsonTextReader reader = new JsonTextReader(file))
{
return (JObject)JToken.ReadFrom(reader);
}
}
catch
{
return default(JObject);
}
//dispose "file" when exiting the method
finally
{
if(file != null)
file.Dispose();
}
}