gpt4 book ai didi

C# - 超出范围时对象是否立即销毁?

转载 作者:可可西里 更新时间:2023-11-01 08:50:34 26 4
gpt4 key购买 nike

我可以相信一个对象在超出 C# 范围时会被销毁并立即调用其析构函数吗?

我认为它应该是因为许多常见的编码实践(例如事务对象)都依赖于这种行为,但我不太习惯使用垃圾收集并且对这些语言通常的行为方式知之甚少。

谢谢。

最佳答案

不,.Net 和 C# 都依赖于垃圾回收内存管理。因此,在 GC 发现销毁对象是合适的之前,不会调用析构函数(在 .Net 中称为终结器)。

另外:C# 中的大多数“常规”对象没有析构函数。如果你需要析构函数模式,你应该实现 IDisposable interfaceDispose Pattern .在一次性对象上,您还应该确保使用 using keyword 调用 Dispose 方法。或者直接调用方法。

为了进一步(希望)澄清:确定性处置在 .Net 中很有用,例如当您需要显式释放不受 .Net 运行时管理的资源时。此类资源的示例有文件句柄、数据库连接等。一旦不再需要这些资源,就立即释放这些资源通常很重要。因此我们不能等待 GC 释放它们。

为了在 .Net GC 的非确定性世界中获得确定性处置(类似于 C++ 的作用域行为),.Net 类依赖于 IDisposable 接口(interface)。借用 Dispose Pattern ,这里有一些例子:

首先,实例化一个一次性资源,然后让对象离开范围,将留给 GC 来处理对象:

1.    {
2. var dr = new DisposableResource();
3. }

要解决这个问题,我们可以显式处理对象:

1.    {
2. var dr = new DisposableResource();
3.
4. ...
5.
6. dr.Dispose();
7. }

但是如果第 2 行和第 6 行之间出现问题怎么办?不会调用 Dispose。为了进一步确保 Dispose 最终将被调用,而不管任何异常,我们可以执行以下操作:

1.    var dr = new DisposableResource();
2. try
3. {
4. ...
5. }
6. finally
7. {
8. dr.Dispose();
9. }

由于经常需要这种模式,C# 包含 using 关键字来简化事情。下面的例子等同于上面的例子:

1.    using (var dr = new DisposableResource())
2. {
3. ...
4. }

关于C# - 超出范围时对象是否立即销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1480868/

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