IDisposable
Dispose
public interface IDisposable{ void Dispose();}
public interface IDisposable
{
void Dispose();
}
IDispose
UnmanagedResource resource = /* ... */;try{ // 各种操作}finally{ resource.Dispose();}
UnmanagedResource resource = /* ... */;
try
// 各种操作
finally
resource.Dispose();
(注:在finally中释放是为了确保即便运行时出错也可以顺利释放资源)
??2:using
using (UnmanagedResource resource = /* ... */){ // 离开using的作用域后会自动调用resource的Dispose方法}// 或者如果不需要额外控制作用域的简写using UnmanagedResource resource = /* ... */;
using (UnmanagedResource resource = /* ... */)
// 离开using的作用域后会自动调用resource的Dispose方法
// 或者如果不需要额外控制作用域的简写
using UnmanagedResource resource = /* ... */;
class UnmanagedResource : IDisposable{ public void Dispose() { // 释放需要释放的资源 } }
class UnmanagedResource : IDisposable
public void Dispose()
// 释放需要释放的资源
Disposable
永远不要假设你的代码会被一直正确地使用,总得留下些兜底的东西,提高健壮性——把你的用户当做一个做着布朗运动的白痴,哪怕他可能是个经验丰富的程序员,甚至你自己。
~
class UnmanagedResource : IDisposable{ // UnmanagedResource的终结器 ~UnmanagedResource() { // 一些操作 }}
// UnmanagedResource的终结器
~UnmanagedResource()
// 一些操作
class UnmanagedResource : IDisposable{ public void Dispose() { // 释放需要释放的资源 } ~UnmanagedResource() { // 终结器调用Dispose释放资源 Dispose(); }}
// 终结器调用Dispose释放资源
Dispose();
(ps:你或许会觉得终结器很像C++的析构函数,无论是声明方式还是作用(释放资源)上,但是终结器和析构函数有本质上差别,但这里不展开讨论)
class UnmanagedResource : IDisposable{ public void Dispose() { // 如果已经释放过就立刻返回 if (_disposed) { return; } // 释放需要释放的资源 // 标记已释放 _disposed = true; } ~UnmanagedResource() { Dispose(); } // 用于标记是否已经释放的字段 private bool _disposed;}
// 如果已经释放过就立刻返回
if (_disposed)
return;
// 标记已释放
_disposed = true;
// 用于标记是否已经释放的字段
private bool _disposed;
Dipose
GC.SuppressFinalize(this)
class UnmanagedResource : IDisposable{ public void Dispose() { if (_disposed) { return; } // 释放需要释放的资源 _disposed = true; // 告诉GC不要调用当前实例(this)的终结器 GC.SuppressFinalize(this); } ~UnmanagedResource() { Dispose(); } private bool _disposed;}
// 告诉GC不要调用当前实例(this)的终结器
GC.SuppressFinalize(this);
class UnmanagedResource : IDisposable{ // 其他代码 private FileStream _fileStream;}
// 其他代码
private FileStream _fileStream;
FileStream
UnmanagedResource
class UnmanagedResource : IDisposable{ // 其它代码 public void Dispose() { // 其他代码 _fileStream.Dispose(); // 其它代码 } private FileStream _fileStream;}
// 其它代码
_fileStream.Dispose();
class UnmanagedResource : IDisposable{ // 其它代码 private void Dispose(bool disposing) { // 其他代码 if (disposing) { // 释放托管资源 _fileStream.Dispose(); } // 释放非托管资源 // 其它代码 }}
private void Dispose(bool disposing)
if (disposing)
// 释放托管资源
// 释放非托管资源
disposing
Dispose(bool disposing)
true
false
private
class UnmanagedResource : IDisposable{ // 其它代码 public void Dispose() { // disposing=true,手动释放托管资源 Dispose(true); GC.SuppressFinalize(this); } ~UnmanagedResource() { // disposing=false,不释放托管资源,交给终结器释放 Dispose(false); } private void Dispose(bool disposing) { if (_disposed) { return; } if (disposing) { // 释放托管资源 } // 释放非托管资源 _disposed = true; }}
// disposing=true,手动释放托管资源
Dispose(true);
// disposing=false,不释放托管资源,交给终结器释放
Dispose(false);
class HandleResource : UnmanagedResource{ private HandlePtr _handlePtr;}
class HandleResource : UnmanagedResource
private HandlePtr _handlePtr;
HandleResource
HandlePtr
virtual
new
// 使用多态class UnmanagedResource : IDisposable{ public virtual void Dispose() { /* ... */}}class HandleResource : UnmanagedResource{ public override void Dispose() { /* ... */}}// 重新实现class UnmanagedResource : IDisposable{ public void Dispose() { /* ... */}}class HandleResource : UnmanagedResource{ public new void Dispose() { /* ... */}}
// 使用多态
public virtual void Dispose() { /* ... */}
public override void Dispose() { /* ... */}
// 重新实现
public void Dispose() { /* ... */}
public new void Dispose() { /* ... */}
这太不“继承了”——显然,有更好的实现方法。
protected
class UnmanagedResource : IDisposable{ protected virtual void Dispose(bool disposing) { /* ... */ }}
protected virtual void Dispose(bool disposing) { /* ... */ }
class HandleResource : UnmanagedResource{ protected override void Dispose(bool disposing) { // 其他代码 base.Dispose(disposing); }}
protected override void Dispose(bool disposing)
base.Dispose(disposing);
IAsyncDisposable
public interface IAsyncDisposable{ ValueTask DisposeAsync();}
public interface IAsyncDisposable
ValueTask DisposeAsync();
Task
ValueTask
await
UnmanagedResource res = /* ... */;try{ // 一些操作}finally{ // 此处添加await等待DisposeAsync操作 await res.DisposeAsync();}
UnmanagedResource res = /* ... */;
// 此处添加await等待DisposeAsync操作
await res.DisposeAsync();
await using (UnmanagedResource res = /* ... */){ // 一些操作}// 或者如果不需要考虑作用域await using UnmanagedResource res = /* ... */;
await using (UnmanagedResource res = /* ... */)
// 或者如果不需要考虑作用域
await using UnmanagedResource res = /* ... */;
DisposeAsync
Marshal
class UnmanagedResource : IAsyncDisposable{ public async ValueTask DisposeAsync() { await _socket.DisposeAsync(); } // 假设Socket类实现了IAsyncDisposable private Socket _socket;}
class UnmanagedResource : IAsyncDisposable
public async ValueTask DisposeAsync()
await _socket.DisposeAsync();
// 假设Socket类实现了IAsyncDisposable
private Socket _socket;
Socket
class UnamangedResource : IAsyncDisposable{ public async ValueTask DisposeAsync() { // 清理(托管)资源 if (_socket != null) { await _socket.DisposeAsync(); _socket = null; } // 清理非托管资源(如果有的话) } private Socket _socket;}
class UnamangedResource : IAsyncDisposable
// 清理(托管)资源
if (_socket != null)
_socket = null;
// 清理非托管资源(如果有的话)
sealed
protected virtual
DisposeAsyncCore
class UnamangedResource : IAsyncDisposable{ public async ValueTask DisposeAsync() { await DisposeAsyncCore(); } protected virtual async ValueTask DisposeAsyncCore() { // 清理(托管)资源 if (_socket != null) { await _socket.DisposeAsync(); _socket = null; } // 清理非托管资源(如果有的话) } private Socket _socket;}
await DisposeAsyncCore();
protected virtual async ValueTask DisposeAsyncCore()
class HandleResource : UnamangedResource{ protected override async ValueTask DisposeAsyncCore() { // 释放子类资源 // 调用父类的DisposeAsyncCore释放父类资源 await base.DisposeAsyncCore(); }}
class HandleResource : UnamangedResource
protected override async ValueTask DisposeAsyncCore()
// 释放子类资源
// 调用父类的DisposeAsyncCore释放父类资源
await base.DisposeAsyncCore();
class UnamangedResource : IDisposable, IAsyncDisposable{ public async ValueTask DisposeAsync(); public void Dispose(); ~UnamangedResource(); protected virtual async ValueTask DisposeAsyncCore(); protected void Dispose(bool disposing);}
class UnamangedResource : IDisposable, IAsyncDisposable
public async ValueTask DisposeAsync();
public void Dispose();
~UnamangedResource();
protected virtual async ValueTask DisposeAsyncCore();
protected void Dispose(bool disposing);
DisposeAsyn
class UnamangedResource : IDisposable, IAsyncDisposable{ public async ValueTask DisposeAsync() { // 清理托管资源 await DisposeAsyncCore(); // disposing=false,只需要让其清理非托管资源 Dispose(false); // 同样,抑制终结器 GC.SuppressFinalize(this); } public void Dispose(); ~UnamangedResource(); protected virtual async ValueTask DisposeAsyncCore() { // 清理托管资源(异步和同步) } protected void Dispose(bool disposing);}
// 清理托管资源
// disposing=false,只需要让其清理非托管资源
// 同样,抑制终结器
// 清理托管资源(异步和同步)
class UnmanagedResource : IDisposable{ // 对IDisposable接口的实现 public void Dispose() { // 调用Dispose(true),同时释放托管资源与非托管资源 Dispose(true); // 让GC不要调用终结器 GC.SuppressFinalize(this); } // UnmanagedResource的终结器 ~UnmanagedResource() { // 调用Dispose(false),仅释放非托管资源,托管资源交给GC处理 Dispose(false); } // 释放非托管资源,并可以选择性释放托管资源,且可以让子类覆写的Dispose(bool disposing)方法 protected virtual void Dispose(bool disposing) { // 防止重复释放 if (_disposed) { return; } // disposing指示是否是否托管资源 if (disposing) { // 释放托管资源 } // 释放非托管资源 // 标记已释放 _disposed = true; }}
// 对IDisposable接口的实现
// 调用Dispose(true),同时释放托管资源与非托管资源
// 让GC不要调用终结器
// 调用Dispose(false),仅释放非托管资源,托管资源交给GC处理
// 释放非托管资源,并可以选择性释放托管资源,且可以让子类覆写的Dispose(bool disposing)方法
protected virtual void Dispose(bool disposing)
// 防止重复释放
// disposing指示是否是否托管资源
class UnmanagedResource : IDisposable, IAsyncDisposable{ // 对IDisposable接口的实现 public void Dispose() { // 调用Dispose(true),同时释放托管资源与非托管资源 Dispose(true); // 让GC不要调用终结器 GC.SuppressFinalize(this); } // 对IAsyncDisposable接口的实现 public async ValueTask DisposeAsync() { // 调用DisposeAsyncCore清理托管资源 await DisposeAsyncCore(); // 调用Dispose(false),仅释放非托管资源 Dispose(false); // 让GC不要调用终结器 GC.SuppressFinalize(this); } // UnmanagedResource的终结器 ~UnmanagedResource() { // 调用Dispose(false),仅释放非托管资源,托管资源交给GC处理 Dispose(false); } // 释放非托管资源,并可以选择性释放托管资源,且可以让子类覆写的Dispose(bool disposing)方法 protected virtual void Dispose(bool disposing) { // 防止重复释放 if (_disposed) { return; } // disposing指示是否是否托管资源 if (disposing) { // 释放托管资源 } // 释放非托管资源 // 标记已释放 _disposed = true; } // 异步释放托管资源 protected virtual async ValueTask DisposeAsyncCore() { // 清理托管资源(同步和异步) }}
class UnmanagedResource : IDisposable, IAsyncDisposable
// 对IAsyncDisposable接口的实现
// 调用DisposeAsyncCore清理托管资源
// 调用Dispose(false),仅释放非托管资源
// 异步释放托管资源
// 清理托管资源(同步和异步)
【1】:IDisposable 接口
【2】:实现 Dispose 方法
【3】:IAsyncDisposable 接口
【4】:实现 DisposeAsync 方法
原文链接:https://www.cnblogs.com/HiroMuraki/p/17693661.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728