C# 无法摆脱CA2202警告

C# 无法摆脱CA2202警告,c#,code-analysis,ca2202,C#,Code Analysis,Ca2202,我已经阅读了MSDN页面上的以下内容: 这也是答案: 但以下代码仍然为我生成2个CA2202警告: FileStream fileStream = null; BufferedStream bufferedStream = null; try { fileStream = File.Open(...); bufferedStream = new BufferedStream(fileStream); using (StreamReader streamReader =

我已经阅读了MSDN页面上的以下内容:

这也是答案:

但以下代码仍然为我生成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_标记为正确。实际上,您也可以对其进行精简,因为正如下面提到的,您不需要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();
    }
}
如果在将这些对象的所有权“传递”给其他对象后不使用底层流,则可以按如下方式消除警告:

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

在将它们传递给其他构造函数后,您是否使用
fileStream
bufferedStream
。我在回答中放置的代码在VS 2017下编译(启用构建分析)时没有警告(前提是
..
块被可用代码替换)。如果您有一个可复制的代码示例,可能会引起警告,请将您的问题包括在内。@Damien_The_unsiever嘿,对不起,当时我没有时间再研究这个问题,但我刚刚回到它,是的,您的解决方案不会生成任何警告,谢谢。我已将答案标记为正确,并将编辑我的原始帖子。这样做,
最终可以删除
,并在使用()的结尾添加以下内容:
bufferedStream=null@DonaldJansen-不,你这样做仍然会得到警告。关键是在另一个构造函数完成后,在不引发异常的情况下,
null
立即输出相应的变量,以便新构造的对象现在负责处理。感谢您的回复,但我仍然使用此方法得到2202警告。@JD41-我没有得到与所列代码完全相同的警告,假设我用有效参数替换第一个
..
,并用其他代码替换第二个
..