如果返回值没有被捕获,会发生什么?#34 ;?

时间:2013-12-10 21:50:38

标签: .net-3.5 filestream

我正在处理的项目有以下代码:

 File.Create(path);

此方法返回FileStream个对象。如果没有关闭,我无法写入已创建的文件。

所以,要解决这个问题,我可以这样做:

var fs = File.Create(path);
fs.Close();

或者只是......

File.Create(path).Close();

这两个片段对我有意义,因为我在我的文件流对象上调用了一个方法。但在我的第一个代码块中,我不明白文件流的位置/发生了什么。如果我没有将它保存在变量中,为什么它会保留在内存中?

2 个答案:

答案 0 :(得分:1)

它位于内存缓冲区中,直到你.flush()流或.close()流告诉它写入磁盘。如果您在写入到流时没有执行其中任何一项操作,则它永远不会离开缓冲区。

答案 1 :(得分:1)

FileStream继承自Stream,后者实现了IDisposable接口。您应该始终处置它,因为它将使用不直接在运行时控制下的资源。

如果您不自行处理它会发生什么情况,垃圾收集器最终会破坏您所拥有的FileStream实例 - 但系统可能无法恢复与该文件相关的基础系统资源。也就是说,你会在那里有一个流,但它将是无法通行的。它只占据记忆中的空间。您可能无法在其他程序(甚至应用程序的其他实例)中编辑或删除该文件,直到操作系统本身强制释放您锁定的资源为止。