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