大多数时候,学生会获得基于控制台的管理系统分配,即图书馆或销售点系统等。 他们必须使用传统的文件系统存储他们的数据。
80-90%的人在打开或创建文件后忘记关闭文件是错误的。
someFile.close();
(他们必须调试所有代码才能找到任何错误,为什么他们的数据没有存储在文件中。作为导师,我自己也经常遇到过这个问题。)
所以真实的是,这些高级语言尤其是Java强制执行异常处理的方式为什么没有任何东西可以强制执行文件关闭?
答案 0 :(得分:7)
资源在被释放时释放(通过垃圾收集,预计不会是确定性的)。如果你想以确定的方式处理它们(而不是在它们解除分配时),在Java中有try
- with-resources块,在C#中有using
块。 / p>
为什么不对包含可自动分解/可处置资源的所有类型强制执行此操作?好吧,仅仅因为这种模式仅在某些用例中是好的。如果他们强制执行,那么在所有其他情况下都会很麻烦。
答案 1 :(得分:1)
你回答了自己的问题。程序员传统上忘记关闭打开的文件。 Java和C#的开发人员坐下来试图找到一种方法来防止传统的编程错误。在这样做时,他们提出了自动垃圾收集的想法。
Java和C#背后的想法是"为什么在运行时环境可以被编程为自动执行时,为什么要依赖程序员来删除对象和关闭文件?"于是诞生了自动垃圾收集。
从C#角度讲,当运行时检测到某个对象已超出范围(例如,不再需要)或需要处理流时,它将被放入垃圾收集队列中。过了一会儿,对象被丢弃,RAM被释放,任何需要关闭的文件都被关闭。
答案 2 :(得分:0)
另一个方面是:在Java中,垃圾收集器(GC)清除了未使用的变量等 - 但只有等待足够长的时间。
对于变量使用的内存,一块内存与另一块内存一样好,所以如果有足够的可用内存,则不需要运行GC。对于流资源,情况并非如此。如果程序的另一部分(或另一个程序)需要该资源,则它需要该资源,并且不能仅交换使用其他资源,因此应该尽快手动关闭。
简而言之:内存是可以互换的 - 资源不是。