无法摆脱CA2202的警告

时间:2017-04-21 10:36:46

标签: c# code-analysis ca2202

我已阅读过MSDN页面:https://msdn.microsoft.com/en-us/library/ms182334.aspx

此SO回答:https://stackoverflow.com/a/32554589/2257227

但是下面的代码仍然会为我生成2个CA2202警告:

FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
    fileStream = File.Open(...);
    bufferedStream = new BufferedStream(fileStream);

    using (StreamReader streamReader = new StreamReader(bufferedStream))
    {
        ...
    }
}
finally
{
    if (bufferedStream != null)
    {
        bufferedStream.Dispose();
    }

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

“bufferedStream.Dispose()”行仍然提供以下两个警告:

  

严重级代码描述项目文件行抑制状态   警告CA2202对象'bufferedStream'可以在方法'Loader.UpdateIndex()'中多次处理。为避免生成System.ObjectDisposedException,您不应在对象上多次调用Dispose:Lines:930 Loader C:\ Users \ user \ Loader \ Loader.cs 930 Active

  

严重级代码描述项目文件行抑制状态   警告CA2202对象'fileStream'可以在方法'Loader.UpdateIndex()'中多次处理。为避免生成System.ObjectDisposedException,您不应在对象上多次调用Dispose:Lines:930,935 Loader C:\ Users \ user \ Loader \ Loader.cs 930 Active

据推测这是因为fileStream可以被多次处理?但是如何多次处理bufferedStream?

编辑:我已将@ Damien_The_Unbeliever的回答标记为正确。你也可以实际修剪它,因为正如下面提到的那样,你不需要bufferedReader变量。这就是我最终的结果。这有点难看,但它有效:

FileStream fileStream = null;
try
{
    fileStream = File.Open("iaushdiuh", FileMode.Open);

    fileStream = null;

    using (StreamReader streamReader = new StreamReader(fileStream))
    {
        streamReader.ReadLine();
    }
}
finally
{
    if (fileStream != null)
    {
        fileStream.Dispose();
    }
}

1 个答案:

答案 0 :(得分:2)

如果您在将这些对象的“所有权”传递给其他对象后使用基础流,则可以将警告静音如下:

        FileStream fileStream = null;
        BufferedStream bufferedStream = null;
        try
        {
            fileStream = File.Open(...);
            bufferedStream = new BufferedStream(fileStream);

            fileStream = null;

            using (StreamReader streamReader = new StreamReader(bufferedStream))
            {

                bufferedStream = null;

                ...
            }
        }
        finally
        {
            if (bufferedStream != null)
            {
                bufferedStream.Dispose();
            }

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

您希望null的赋值在构造函数调用之后立即发生,该构造函数调用“取得一次性对象的所有权”。通过这种方式,您确保如果构造函数抛出,则释放内部对象,如果构造函数成功,那么它将安排处理发生。