首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >using语句中的流的CA2000/CA2202

using语句中的流的CA2000/CA2202
EN

Stack Overflow用户
提问于 2014-02-20 01:07:38
回答 2查看 519关注 0票数 0

最近,CA2000和CA2202警告成了我生存的祸根。我在这里做错了什么?基本上,我使用File.Open获取一个FileStream,然后将其传递给一个函数,该函数可能会返回一个新的流,也可能返回相同的流。然后,我对我的流执行一些更多的操作,然后在我的finally块中,如果我正在使用的流不同的话,我会将它处理掉。

我收到两个CA警告。2000用于using块中的fileStream,2202用于finally块中的changedStream。怎么回事?

代码语言:javascript
复制
using (Stream fileStream = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    Stream changedStream = null;
    try
    {
        changedStream = someCondition ? fileStream : DoSomeActionThatMayReturnNewStream(fileStream);
        DoSomeMoreStuffWithStream(changedStream);
    }
    finally
    {
        if (changedStream != null && changedStream != fileStream)
        {
            changedStream.Dispose();
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2014-02-20 03:03:42

在什么情况下,如果有的话,DoSomeActionThatMayReturnNewStream会处理传入的流?如果当它创建一个新的流时,它会处理掉传入的流(这通常是预期的),那么由using块触发的Dispose将是冗余的。

如果DoSomeActionThatMayReturnNewStream从不处理传入的流,那么代码的行为看起来可能是正确的,但是FxCop无法分析其复杂且非正统的对象所有权模式。我建议你最好像这样做

代码语言:javascript
复制
Stream inputFile = null;
try
{
  inputFile = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
  DoSomeActionThatMayReturnNewStream(ref inputFile);
  DoSomeMoreStuffWithStream(inputFile);
}
finally
{
  if (inputFile != null)
    inputFile.Dispose();
}

如果DoSomeActionThatMayReturnNewStream要打开一个新的流,它应该处理掉旧的流。它应该在关闭旧的流之前立即将变量设为空,并在打开新的流时立即赋值。这将确保如果在方法过程中发生异常,当且仅当之前未处理过旧流时,旧流才会被处理,如果其构造函数完成,则新流也会被处理,即使DoSomeActionThatMayReturnNewStream在此之后抛出了异常如果该方法在新流上调用Dispose以防抛出异常,那么在这种情况下,它应该清空该变量。

票数 1
EN

Stack Overflow用户

发布于 2014-02-20 03:26:42

以下内容有什么问题:

代码语言:javascript
复制
using (var fileStream = System.IO.File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (var changedStream = someCondition ? fileStream : DoSomeActionThatMayReturnNewStream(fileStream))
    {
        DoSomeMoreStuffWithStream(changedStream);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21887426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档