Asp.net iDisposable类中的一次性对象是否保证从内存中释放?
鉴于以下类别:Asp.net iDisposable类中的一次性对象是否保证从内存中释放?,asp.net,memory,idisposable,Asp.net,Memory,Idisposable,鉴于以下类别: public sealed class DistributedLock : IDisposable { private IRedLock Lock { get; } private bool _disposed; public DistributedLock(string lockKey, TimeSpan expiry) { Lock = RedLockController.GetConnection().CreateLock(
public sealed class DistributedLock : IDisposable
{
private IRedLock Lock { get; }
private bool _disposed;
public DistributedLock(string lockKey, TimeSpan expiry)
{
Lock = RedLockController.GetConnection().CreateLock(lockKey, expiry);
}
private void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
if (Lock != null)
{
Lock.Dispose();
}
}
_disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
~DistributedLock()
{
Dispose(false);
}
}
其中,IRedLock
实现了iDisposable
,我以以下方式使用上述类:
using(new DistributedLock("SomeKey"))
{
... do something
}
DistributedLock
和containedIRedLock
类在任何情况下都会从内存中释放吗?IDisposable
是关于管理内存以外的资源:GDI句柄、套接字、文件句柄等。它不会抢占垃圾收集器。因此,IDisposable
只能在两种情况下帮助您释放内存:
IRedLock
类型获取了非托管内存,例如通过第三方库或不安全的代码
Dispose()
方法从其他对象中清除对此对象的引用,以确保该对象在可能没有垃圾收集的情况下(例如,事件处理程序)有资格进行垃圾收集IDisposable
中获得任何好处
在此代码中,您可以从IDisposable
获得更好的机制来释放这一行中暗示的连接:
Lock = RedLockController.GetConnection().CreateLock(lockKey, expiry);
但是,您可能不需要关联的终结器。您只包装已经有终结器的其他内容,因此可以使用更简单的IDisposable模式,而不需要额外的复杂性:
public sealed class DistributedLock : IDisposable
{
private IRedLock Lock { get; }
public DistributedLock(string lockKey, TimeSpan expiry)
{
Lock = RedLockController.GetConnection().CreateLock(lockKey, expiry);
}
public void Dispose()
{
Lock?.Dispose();
}
}
非常感谢您的回答,新的dispose模式更容易理解。