我有一个只读的 FileStream,它是一个方法局部变量:
public void SomeMethod()
{
var fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite));
... //some stream operations
}
我应该在方法结束时调用 Dispose(显式还是通过“使用”)?它会改变什么?
它的作用无关紧要,IDisposable
由 实现FileStream
,因此您需要Dispose
在使用完它后隐式或显式调用。它是在代码中使用类的合同的一部分。
我认为最好将其包含在using
声明中。如果您真的希望代码健壮,您还需要异常处理。它会像现在一样工作,这只是不好的做法。
处理任何实例实现是必须的,并且通过语句IDisposable
来处理它是一种良好的做法。using
不要认为特别分析每个案例会有帮助。
如果您未能处理,则FileStream
在 GC 启动(非确定性)之前不会关闭。
在这种情况发生之前,您将持有一个打开的文件句柄,阻止对文件的某些类型的访问(例如写入、删除)。
请注意,指定FileShare.ReadWrite
不一定有帮助 - 如果另一个作者尝试使用FileShare.None
(例如通过调用File.OpenWrite
)打开文件,他将无法这样做,直到您关闭文件。
所以,是的,请关闭文件,并using
声明。
如果一个对象可以被释放,你应该在你不再需要它的时候就释放它。来自FileStream 类主题:
如果一个进程以文件的一部分被锁定而终止或关闭一个具有未完成锁定的文件,则行为是未定义的。
正如大家所建议的那样:处理每个IDisposable
,最好与using
.
现在对于文件,当您真的想阻止其他人访问/修改文件时,可能会有特殊情况。在这种情况下,您仍然会在某个时间点处理文件,但是这个“某个时间点”可能会在代码/应用程序生命周期的后期显着增加。