最近,CA2000和CA2202警告成了我生存的祸根。我在这里做错了什么?基本上,我使用File.Open获取一个FileStream,然后将其传递给一个函数,该函数可能会返回一个新的流,也可能返回相同的流。然后,我对我的流执行一些更多的操作,然后在我的finally块中,如果我正在使用的流不同的话,我会将它处理掉。
我收到两个CA警告。2000用于using块中的fileStream,2202用于finally块中的changedStream。怎么回事?
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();
}
}
}发布于 2014-02-20 03:03:42
在什么情况下,如果有的话,DoSomeActionThatMayReturnNewStream会处理传入的流?如果当它创建一个新的流时,它会处理掉传入的流(这通常是预期的),那么由using块触发的Dispose将是冗余的。
如果DoSomeActionThatMayReturnNewStream从不处理传入的流,那么代码的行为看起来可能是正确的,但是FxCop无法分析其复杂且非正统的对象所有权模式。我建议你最好像这样做
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以防抛出异常,那么在这种情况下,它应该清空该变量。
发布于 2014-02-20 03:26:42
以下内容有什么问题:
using (var fileStream = System.IO.File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (var changedStream = someCondition ? fileStream : DoSomeActionThatMayReturnNewStream(fileStream))
{
DoSomeMoreStuffWithStream(changedStream);
}
}https://stackoverflow.com/questions/21887426
复制相似问题