【问题标题】:How check dispose in C#如何在 C# 中检查 dispose
【发布时间】:2021-11-12 13:41:35
【问题描述】:

我想检查所有方法中的 dispose:

public class WebSocketClient : IDisposable
{
    private ClientWebSocket _socket;
    private bool _isDisposed;
    //methods
    public void SetBuffer(int receiveBufferSize, int sendBufferSize) =>
            _socket.Options.SetBuffer(receiveBufferSize, sendBufferSize); //How check dispose?
    //other methods
    protected virtual void Dispose(bool disposing)
    {
        if (!_isDisposed)
        {
            if (disposing)
            {
                _socket.Dispose();
            }
            _isDisposed = true;
        }
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}

我添加了检查 dispose 的方法,如果对象未释放,则运行 acrion:

public async Task CallWithCheckDispose(Func<Task> func)
{    
    if (!_isDisposed)
        await func.Invoke();    
    else
        throw new ObjectDisposedException(GetType().Name);
}
public async Task CallWithCheckDispose(Action func)
{    
    if (!_isDisposed)
        func.Invoke();    
    else
        throw new ObjectDisposedException(GetType().Name);
}

并使用它:

public async Task SetBuffer(int receiveBufferSize, int sendBufferSize) =>
    await CallWithCheckDispose(() =>
        _socket.Options.SetBuffer(receiveBufferSize, sendBufferSize);
    );

但我认为这不是最好的解决方案 还有其他解决办法吗?

【问题讨论】:

    标签: c# .net .net-core


    【解决方案1】:

    您可以使用辅助方法,如下所示:

    private void checkDisposed() {
      if (_isDisposed) {
        throw new ObjectDisposedException();
      }
    }
    

    然后,在您的其他每个方法中:

    public async Task CallWithCheckDispose(Func<Task> func)
    {
      checkDisposed();
      await func.Invoke();
    }
    

    【讨论】:

    • 我的解决方法正常吗?
    • “正常”是什么意思?
    • @Null Pointer Exception,你的解决方案好像是常见的IDisposable接口实现:docs.microsoft.com/en-us/dotnet/standard/garbage-collection/…,那为什么不正常呢?
    • @NullPointerException 虽然@Mark Benningfield 使用的CheckDisposed() 方法是最常用的方法,但使用CallWithCheckDispose() 包装器非常好,因为您似乎更喜欢表达式主体块体上的语法。所以不,使用像CallWithCheckDispose 这样的包装器并不是最常见 看到的模式,但如果这能回答你的问题,它肯定是一个有效的解决方案。我不太清楚你所说的“正常”是什么意思
    • @MarkBenningfield 我的意思是可以改进它
    猜你喜欢
    • 2016-06-25
    • 2010-12-07
    • 2021-09-13
    • 2011-09-20
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多