c# – 防止多次处置对象

请考虑以下代码:

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

当写入流被处理时,它在内部处理FileStream流.

除了MSDN recommendation以外,是否还有其他设计可以在finally子句中处理外部使用的流:

Stream stream = null;
try
{
    stream = new FileStream("file.txt", FileMode.OpenOrCreate);
    using (StreamWriter writer = new StreamWriter(stream))
    {
        stream = null;
        // Use the writer object...
    }
}
finally
{
    if(stream != null)
        stream.Dispose();
}
最佳答案
在这种情况下,FxCop与.NET Framework中的设计选择存在很大差异. StreamWriter假定流的所有权引起问题.这通常是“成功的陷阱”设计选择,大多数程序员都会认为关闭StreamWriter足以让流处理掉.当他们使用Close()而不是Dispose()时尤其如此.

这在绝大多数情况下都很有效.大多数情况下,CryptoStream是一个非常有问题的特殊用法.在CryptoStream被刷新和处理之前关闭基础流时需要刷新和不可诊断故障的类. FxCop警告适当的情况,尽管它太容易辨认特定问题太过神秘;)

一般情况下,程序员编写了自己的Dispose()方法,并且忘记了多次调用它的安全性.这就是FxCop警告意味着要引起注意的问题,因此能够看到Dispose方法实际上是安全的并不够智能.

在这种特定情况下,FxCop警告是没用的.所有.NET Framework提供的Dispose()方法实现都是安全的. FxCop应该自动禁止.NET框架代码的这种警告.但事实并非如此,微软也使用它. .NET框架源代码中有很多[SuppressMessage]属性.

解决警告太丑陋且容易出错.毫无意义,因为没有什么事实出错.请记住,FxCop只是一个诊断工具,旨在生成“你考虑过这个”消息.当你忽视规则时,警察警察不会把你关进监狱.这是编译器的工作.

使用[SuppressMessage]属性关闭警告.

转载注明原文:c# – 防止多次处置对象 - 代码日志