【发布时间】:2010-09-16 08:27:00
【问题描述】:
我有一个 C# 对象,它的关键资源需要在非常特定的时间点刷新,这使得它不适合让垃圾收集器随时处理它,我应该如何处理这个问题?有没有像 C++ 的删除操作符这样的东西,可以让我在需要时手动杀死这个对象的实例?
【问题讨论】:
标签: c# garbage-collection
我有一个 C# 对象,它的关键资源需要在非常特定的时间点刷新,这使得它不适合让垃圾收集器随时处理它,我应该如何处理这个问题?有没有像 C++ 的删除操作符这样的东西,可以让我在需要时手动杀死这个对象的实例?
【问题讨论】:
标签: c# garbage-collection
这正是IDiposable 接口的用途。您在Dispose() 方法中释放关键资源,然后将对象留给垃圾处理器处理释放内存。
【讨论】:
Google 的 IDisposable 接口。这是您唯一可用的机制。如果您的关键资源不受管理,它是量身定制的。如果它是托管资源,您能否更具体地说明需要“刷新”的内容。
【讨论】:
添加了 IDisposable 接口以支持 C++/CLI 中的确定性销毁,您可以在任何 .NET 语言中使用它。这就是你想要的。
【讨论】:
如果您谈论的是您认为“必须”在特定时间释放的特定托管资源,则可以在取消引用该对象后专门调用垃圾收集器的 Collect 方法,但需要考虑性能想到了,通常垃圾收集器知道何时收集项目。总的来说,这是一个坏主意。
正如其他人在上面提到的,IDisposable 模式有助于在需要时释放非托管资源。
注意:我要重复一遍,您可以调用 GC.Collect() 但这不是一件好事,而是该问题的有效答案!
【讨论】:
IDisposable 接口用于确定性销毁。在MSDN 上有一个正确实现它的模式。
当您的对象的生命周期不跨越多个范围时,您还应该考虑使用using statement。
【讨论】:
您正在寻找IDisposable。这是一个实现这一点的示例类。
class MyDisposableObject : IDisposable
{
public MyDisposableObject()
{
}
~MyDisposableObject()
{
Dispose(false);
}
private bool disposed;
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
// Dispose of your managed resources here.
}
// Dispose of your unmanaged resources here.
this.disposed = true;
}
}
void IDisposable.Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
要使用它,你可以这样做:
public void DoingMyThing()
{
using (MyDisposableObject obj = new MyDisposableObject())
{
// Use obj here.
}
}
using 关键字确保IDisposable 上的Dispose() 方法在其作用域结束时被调用。
【讨论】: