无法摆脱CA2202警告



我已经阅读了以下内容:https://msdn.microsoft.com/en-us/library/ms1823334.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.updateex(("中多次处理。为了避免生成系统。ObjectDisposedException,您不应在对象上拨打一次以上的时间。

严重性代码描述项目文件行抑制状态 警告Ca2202对象" fileStream"可以在方法" loader.updateex(('中多次处置。为了避免生成系统。ObjectDisposedException您不应在对象上拨打一次以上的拨打。

大概这是因为文件流不止一次处置?但是如何将缓冲屏置于多次处置?

编辑:我已将 @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();
    }
}

如果您不使用使用"将这些对象"所有权"转换给其他对象后的基础流,则可以像这样沉默警告:

        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的分配在构造函数呼叫之后立即进行,以"获得"一次性对象的"所有权"。这样,您可以确保如果构造函数抛出,则将内部对象和处置,如果构造函数成功,那么它将安排处置发生。

相关内容

  • 没有找到相关文章

最新更新