我有一个 C# 对象,它的关键资源需要在非常特定的时间点刷新,这使得它不适合让垃圾收集器随时处理它,我应该如何处理这个问题?是否有类似 C++ 的 delete 运算符之类的东西可以让我在需要时手动终止该对象的实例?
Joe Rivas
问问题
9398 次
6 回答
22
您正在寻找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()
方法 on在其IDisposable
作用域结束时被调用。
于 2008-10-09T18:30:06.510 回答
2
这正是IDiposable
接口的用途。您在方法中释放关键资源Dispose()
,然后将对象留给垃圾处理器处理释放内存。
于 2008-10-09T18:18:05.550 回答
0
谷歌的 IDisposable 接口。这是您唯一可用的机制。如果您的关键资源不受管理,它是量身定制的。如果它是托管资源,您能否更具体地说明需要“刷新”的内容。
于 2008-10-09T18:19:11.023 回答
0
添加了 IDisposable 接口以支持 C++/CLI 中的确定性销毁,您可以从任何 .NET 语言中使用它。这就是你想要的。
于 2008-10-09T18:20:11.613 回答
0
如果您谈论的是您认为“必须”在特定时间释放的特定托管资源,则可以在取消引用对象后专门调用垃圾收集器的收集方法,但需要考虑性能注意事项,通常垃圾收集器知道何时收集项目。总的来说,这是一个坏主意。
正如其他人在上面提到的,IDisposable 模式有助于在需要时释放非托管资源。
注意:我要重复一遍,您可以调用 GC.Collect() 但这不是一件好事,而是该问题的有效答案!
于 2008-10-09T18:20:39.913 回答