当前位置: 首页 > 知识库问答 >
问题:

为什么像C#和Java这样的高级语言不强制文件关闭?[已关闭]

陈开宇
2023-03-14

想改进这个问题吗 通过编辑这篇文章,更新问题,使其能够用事实和引文回答。

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

80-90%的人在打开或创建文件后忘记关闭文件。

someFile.close();

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

所以真正的问题是,这些高级语言特别是Java强制执行异常处理的方式,为什么没有任何强制执行文件关闭?

共有3个答案

葛永丰
2023-03-14

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

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

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

范豪
2023-03-14

你回答了自己的问题。程序员通常会忘记关闭打开的文件。Java和C的开发人员坐下来,试图想出一种方法来防止传统的编程错误。为此,他们提出了自动垃圾收集的想法。

Java和C#背后的想法是“当运行时环境可以被编程为自动删除对象和关闭文件时,为什么要依赖程序员来删除对象和关闭文件?”因此诞生了自动垃圾回收机制。

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

咸高谊
2023-03-14

每当资源被释放时,就会释放它们(通过垃圾收集,这不是确定性的)。如果你想以确定性的方式处置它们(而不是在它们被释放的时候),在Java有try-with-资源块,在C#中有使用块。

为什么他们不强制所有封装自动关闭/一次性资源的类型都这样?很简单,因为这种模式只在某些用例中有效。如果他们强制执行,在所有其他情况下都会很麻烦。

 类似资料:
  • 根据我所学到的,抽象是一个隐藏内部实现的概念。 在Java中,我们可以通过接口、抽象关键字(类/方法)以及方法来实现抽象。例如扫描器s=新扫描器(System.in);int x=s.nextint();这里我们不需要了解nextInt()方法的任何内容。所以我可以说这是抽象。 同样的事情也可以在C语言中用printf()实现 所以,如果即使在非OOP语言中也能实现抽象,那么为什么在基于OOP的语

  • 为什么jaxb在下面生成一个名为的类型参数? 这个文件是由JavaTM体系结构用于XML绑定(JAXB)参考实现生成的: 也许这是一个我不知道的设计模式?

  • 我在练习leetcode第5题。真正让我困惑的是这里C++(20ms)和Python(1000ms)之间巨大的运行时差异。 我知道Python是一种解释性语言,所以一般来说它比C++慢。但是在这里,C++比Python快50倍是我无法理解的。两个程序都使用相同的算法,所以并非如此。是因为C++和Python中字符串的实现方式吗? C++ Python

  • 我将EclipseLink与JTA一起使用。当我使用WebLogic server版本(12.2.1.3.0)运行应用程序时,遇到了以下问题 PS-WebLogic版本(12.2.1.2.0)不面临此问题

  • C语言快慢链表判断链表是否有环 hasCycle函数while(slow != NULL && fast !=NULL)时会报错 那为什么写成while(slow != NULL && fast->next != NULL)就没问题啊,快慢指针不是当slow和fast相遇的时候,证明链表有环吗?当slow和fast都不为空时,slow向后移动一位,fast移动两位,当他们相遇的时候即链表有环,若s

  • 问题内容: 已关闭 。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 这个问题困扰了我很长时间(正如我之前的问题所证明的):为什么比(确切地说是更pythonic的)更好? 对于那些不知道的人,该语句已更改为Python 3.0中的函数。正式文档在PEP 3105中 ,动机在Guido van Ross