我有一个C#对象,其中一个关键资源需要在非常具体的时间点刷新,这使得它成为一个糟糕的候选者,让垃圾收集器无论什么时候处理它,我应该如何处理它?是否有类似C ++的删除操作符,可以让我在需要时手动终止该对象的实例?
答案 0 :(得分:21)
您正在寻找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
关键字可确保Dispose()
上的IDisposable
方法在其范围的末尾被调用。
答案 1 :(得分:2)
这正是IDiposable
接口的用途。您在Dispose()
方法中释放关键资源,然后将对象留给垃圾处理器来处理释放内存。
答案 2 :(得分:2)
IDisposable接口存在确定性破坏。有一种模式可以在MSDN上正确实现它。
同时,当对象的生命周期不跨越多个范围时,您还应该考虑使用using statement。
答案 3 :(得分:0)
Google用于IDisposable界面。这是您可以使用的唯一机制。如果您的关键资源不受管理,那么它就是量身定制的。如果它是一个托管资源,你是否可以更具体地说明需要“刷新”的内容。
答案 4 :(得分:0)
添加了IDisposable接口以支持C ++ / CLI中的确定性销毁,您可以从任何.NET语言中使用它。这就是你想要的。
答案 5 :(得分:0)
如果您正在讨论在特定时间“必须”发布的特定托管资源,则可以在取消引用该对象后特定地调用Garbage Collectors的Collect方法,但是性能考虑因素是通常,垃圾收集器知道何时收集物品。总的来说这是一个坏主意。
正如其他人在上面提到的那样,IDisposable模式有助于在需要时释放非托管资源。
注意:我要重复一遍,你可以调用GC.Collect(),但这不是一件好事,而是问题的有效答案!