为什么 .NET 垃圾收集器不调用废弃对象的析构函数?

问题描述 投票:0回答:1

我有一个简单的帐户课程。当我创建一个由“a”引用的对象时。但之后我将 null 分配给 a。此外,我还调用了 GC.Collect(),它的工作是从堆内存中清除所有废弃的对象。 并且由于 a 先前引用的对象不再被任何引用变量引用,因此应该清除它,因此应该调用它的析构函数。但令人惊讶的是我没有得到所需的输出。

  1. CLR 是否执行了一些优化?
class Account
{
    int AccountNo;
    string Name;
    decimal Balance;
    public Account()
    {
        Console.WriteLine("account object created");
    }
    ~Account()
    {
        Console.WriteLine("account object destroyed");
    }
}

class ObjectOrientedExample
{
    static void Main()
    {
        Account a = new Account();
        a = null;
        GC.Collect();
    }
}
c# .net clr
1个回答
0
投票

如果您只关心内存,请让 .Net 处理它(即,当 .Net 认为合适的时候运行垃圾收集)。 如果您有需要清除、释放、关闭的内容(打开文件、dbms 连接等),因此您希望进行 guaranteed 调用, 您应该为

IDisposable
实现
Account
接口,然后添加
using
:

class Account: IDisposable {
  ...

  protected virtual void Dispose(bool disposing) {
    Console.WriteLine("Time to clear Account instance");
  }

  public void Dispose() => Dispose(true);
}

然后

static void Main()
{
    
    // Note "using"
    using Account a = new Account();
        
    ...
}  // <- a.Dispose() will be called here, on leaving Account instance scope 
© www.soinside.com 2019 - 2024. All rights reserved.