为什么像C#和Java这样的高级语言不强制执行文件关闭



大多数时候,学生都会获得基于控制台的管理系统作业,即图书馆或销售点系统等。他们必须使用传统的文件系统来存储数据。

80-90%的时候,他们会在打开或创建文件后忘记关闭文件

someFile.close();

(他们必须调试所有代码才能找到任何错误,以及为什么他们的数据没有存储在文件中。作为一名导师,我自己也多次遇到这个问题。)

因此,真正的问题是,这些高级语言(尤其是Java)执行异常处理的方式,为什么没有任何东西可以强制关闭文件?

资源在任何时候都会被释放(通过垃圾收集,这是不确定的)。如果你想以确定性的方式(而不是在它们释放的时候)处理它们,在Java中有try-带资源的块,而在C#中则有using块。

为什么他们不强制所有封装可自动生成/可丢弃资源的类型都这样做?好吧,只是因为这个模式只在某些用例中是好的。如果他们强制执行,在所有其他情况下都会很麻烦。

您回答了自己的问题。传统上,程序员确实忘记了关闭打开的文件。Java和C#的开发人员坐下来,试图想出一种方法来防止传统的编程错误。在这样做的过程中,他们提出了自动垃圾收集的想法。

Java和C#背后的想法是"当运行时环境可以被编程为自动删除对象和关闭文件时,为什么要依赖程序员来删除对象和打开文件?"因此,自动垃圾收集应运而生。

从C#的角度来看,当运行时检测到对象超出了范围(例如,不再需要)或需要处理流时,它会被放入垃圾收集队列。一段时间后,对象被处理掉,RAM被释放,所有需要关闭的文件都被关闭。

另一个方面是:在Java中,未使用的变量等由垃圾回收器(GC)清理,但前提是等待足够长的时间。

变量使用内存时,一段内存和另一段内存一样好,所以如果有足够的内存可用,GC就不需要运行。对于流资源,情况并非如此。如果程序的另一部分(或另一个程序)需要该资源,它需要该资源并且不能互换地使用另一个资源,因此应该尽快手动关闭。

简而言之:内存是可以互换的,而资源不是。

最新更新