2013-03-14 95 views
1

我有一个只读的FileStream这是一种方法的局部变量:我应该处理只读的FileStream

public void SomeMethod() 
{ 
    var fileStream = File.Open(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); 
    ... //some stream operations 
} 

我应该调用Dispose(明确或通过“使用”)在方法的结束?它会改变什么?

+3

始终处置。始终处置。 – ChaosPandion 2013-03-14 19:42:08

回答

2

如果您未能处置,FileStream将不会关闭,直到GC启动(非确定性)。

而直到出现这种情况,你会抱着开放的文件句柄,防止某些类型的访问文件(例如,写入,删除)。

请注意,指定FileShare.ReadWrite不一定会帮 - 如果另一位作家试图打开该文件FileShare.None(例如通过调用File.OpenWrite),他将不能够这样做,直到你关闭文件。

所以,是的,做关闭文件,具有using声明。

+0

+1用于描述和分析副作用。 – 2013-03-14 20:08:28

3

我认为最好在using声明中包装。如果你真的希望代码强大,你还需要异常处理。它会像现在这样工作,这只是不好的做法。

4

它的作用并不重要,IDisposableFileStream实现,因此当您完成使用时,您需要隐式或显式调用Dispose。它是代码中使用该类的合约的一部分。

+0

您对单词合同的使用很​​重要。 – ChaosPandion 2013-03-14 19:46:06

3

这是处置实施IDisposable任何实例和一个很好的做法处置它槽using声明是必须的。

不要认为分析每个案件特别有助于。

0

如果一个对象可以被配置,你应该早在你不需要它了处理它。从FileStream Class话题:

如果一个进程,锁定的文件的一部分终止或关闭拥有出色的锁文件 ,行为是不确定的。

0

大家都建议:处置每IDisposable,最好用using

现在的文件有可能是当你真的想阻止所有人访问/修改文件的其他特殊情况。在这种情况下,您仍然会在某个时间点处理文件,但是这个“某个点”可能会在代码/应用程序生命周期中显着较晚。

+0

“如果真的要阻止其他人,可能会有特殊情况” - 如果是这样,您应该持有对打开的FileStream的静态引用,以便在不再希望阻止它时确定性地关闭它。 – Joe 2013-03-14 20:10:34

+0

@Joe,是的,这正是我想说的(也是我试图不说“静态”,因为当你真正的意思是“随着单一方法调用之外的生命期而变化时,大多数人会把它看作静态的”)。 – 2013-03-14 20:48:44