如何解决CA2202:避免生成System.ObjectDisposedException警告

时间:2015-12-26 08:51:45

标签: c# file json.net warnings

每次在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   一次在一个物体上。

1 个答案:

答案 0 :(得分:2)

MSDN:

  

嵌套使用语句(在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();
    }
}