1

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

还有这个答案: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。:行:930 Loader C:\Users\user\Loader\Loader.cs 930 Active

严重性代码 描述 项目文件行抑制状态警告 CA2202 对象“fileStream”可以在方法“Loader.UpdateIndex()”中多次处理。为避免生成 System.ObjectDisposedException,您不应在对象上多次调用 Dispose。:行: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();
    }
}
4

1 回答 1

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“取得一次性对象的所有权”的构造函数调用之后立即进行分配。通过这种方式,您可以确保如果构造函数 throws,则处置内部对象,如果构造函数成功,那么它将安排处置发生。

于 2017-04-21T10:46:11.257 回答