gpt4 book ai didi

c# - 关于 .net 内存管理的疑问

转载 作者:太空狗 更新时间:2023-10-29 22:04:20 25 4
gpt4 key购买 nike

我正在从《Professional C#》一书中学习C#中的内存管理

The presence of the garbage collector means that you will usually not worry about objects that you no longer need; you will simply allow all references to those objects to go out of scope and allow the garbage collector to free memory as required. However, the garbage collector does not know how to free unmanaged resources (such as file handles, network connections, and database connections). When managed classes encapsulate direct or indirect references to unmanaged resources, you need to make special provision to ensure that the unmanaged resources are released when an instance of the class is garbage collected.

When defining a class, you can use two mechanisms to automate the freeing of unmanaged resources.

  1. Declaring a destructor (or finalizer) as a member of your class.
  2. Implementing the System.IDisposable interface in your class.

有几件事我不明白:

  1. “非托管资源(例如文件句柄、网络连接和数据库连接)”。他们有什么大不了的?他们怎么没有管理? (或)为什么 GC 不能管理这些资源?

  2. 我们将在类的终结器或 Dispose() 方法中放置什么代码,这些代码究竟是什么样子的?使用这些资源的一些示例会很有帮助。

最佳答案

.NET 框架上的某些类只是 Windows API 或第三方程序集的包装器。这些 API 不是托管代码(它们可以用 C++ 编写或者它们是旧的 COM 程序集)并且垃圾收集器不知道应用程序何时不再需要它们。

例如,当您打开一个磁盘文件时,它会一直保持打开状态,直到您告诉它关闭该文件。如果您在不关闭文件的情况下销毁指向文件的指针(即离开范围),则该文件将保持打开状态并处于锁定状态。

在框架上为这些类实现的 Dispose 方法调用以干净的方式完成实例所需的内部 Close 方法。因此,所有包装非托管代码的类都应该实现 Disposable 接口(interface),以确保它实现了关闭方法。

然后,当您实例化该类时,最好使用 using 语句来执行此操作,因为当您离开作用域时,会自动调用 Dispose 方法。

关于c# - 关于 .net 内存管理的疑问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1688222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com