首页 > 解决方案 > C# 在不使用的情况下处理异常资源

问题描述

我正在编写一个包含套接字操作的类库。我不想依赖消费者在完成后或抛出异常时处理资源。

通常我会使用“using”语句,但这在本地范围之外不起作用。就我而言,我正在上课并且在许多公共方法中使用 Socket。连接结束时处理 Socket 很容易,但是在没有“使用”块的情况下抛出异常时如何处理它?

这是我想出的:基本上我用try catch块封装了用户可以访问的每个方法。如果发生异常,我会在向用户抛出异常之前处理资源。

但我想知道是否有更好的选择。如果我对图书馆消费者隐藏这种自动处理,这很糟糕。

public class Foo
{
    Socket _socket;

    public void method1()
    {
         try
         {
              // some work with _socket
         }
         catch
         {
             _socket.Dispose();
             throw;
         }
    }
}

标签: c#disposeidisposableusing-statement

解决方案


您有2 个选择:

要么使用标准IDisposable实现

  public class Foo : IDisposable {
    Socket _socket;

    ...

    public void method1() {
      // working with _socket
    }

    protected virtual void Dispose(bool disposing) {
      if (disposing) {
        if (_socket != null) {
          _socket.Dispose();

          _socket = null;
        }  
      }
    }  

    public void Dispose() {
      Dispose(true); 
    }
  }

或者_socket变成局部变量

public void method1() {
  using (Socket _socket = new Socket(...)) {
    // working with _socket
  }
}

推荐阅读