我有一个C#对象,其中包含关键资源,需要在非常特定的时间点进行刷新,因此不能留给垃圾回收程序自己处理。请问应该如何处理?是否有类似于C++的delete运算符,让我可以在需要时手动销毁该对象实例?
我有一个C#对象,其中包含关键资源,需要在非常特定的时间点进行刷新,因此不能留给垃圾回收程序自己处理。请问应该如何处理?是否有类似于C++的delete运算符,让我可以在需要时手动销毁该对象实例?
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()
方法在其作用域结束时被调用。
搜索IDisposable接口。这是您唯一可用的机制。如果您的关键资源是非托管的,则此接口非常适合您。如果它是托管资源,请具体说明需要“清除”什么。
为了支持C++/CLI中的确定性销毁,IDisposable接口被添加了进来,你可以在任何.NET语言中使用它。这正是你想要的。
如果您正在谈论一个特定的托管资源,您感觉它“必须”在特定时间释放,那么您可以在取消引用对象后专门调用垃圾回收器的Collect方法,但需要考虑性能问题,因为通常垃圾回收器知道何时收集项目。总的来说,这是一个不好的想法。
正如其他人在上面提到的,IDisposable模式有助于在需要时释放非托管资源。
注意:我要重申,您可以调用GC.Collect(),但这不是一件好事,但对于这个问题来说是一个有效的答案!