CA2202示例中为何在使用StreamWriter前将Stream设为null?
为什么在StreamWriter使用前要设置
stream = null;? 咱先看看这段微软文档里的代码示例:
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();
}
这行stream = null;的核心作用就是避免对同一个流对象执行双重释放(double-dispose),咱掰碎了说:
- 首先,
StreamWriter的using语句块会在执行完毕后自动调用Dispose()方法,而StreamWriter默认会在自己被释放的时候,同时释放它所包装的底层stream实例(也就是这里的FileStream)。 - 如果不把
stream变量设为null,那么在finally块里,stream仍然指向那个已经被StreamWriter释放过的FileStream对象,这时候finally里的stream.Dispose()就会再次调用这个对象的释放方法。虽然大部分.NET类的Dispose()是幂等的(多次调用不会报错),但这显然不是规范的做法,甚至有些特殊的资源实现可能会因为重复释放出现异常。 - 把
stream设为null后,finally块里的if(stream != null)判断就会不成立,自然就跳过了重复释放的操作,保证资源只被释放一次。
顺带提一句:现在我们有更简洁的写法来避免这种繁琐的处理,比如直接把FileStream的创建嵌套到StreamWriter的using里,但这个示例的目的是为了清晰展示手动管理资源时的注意事项,所以用了这种稍显“复古”的写法来突出核心逻辑。
内容的提问来源于stack exchange,提问作者mschuurmans
相关产品推荐
相关产品推荐

