C#在不使用异常的情况下分配资源

问题描述 投票:0回答:1

我正在编写一个包含套接字操作的类库。我不想依靠使用者在完成处理后或引发异常时处置资源。

通常,我会使用“ using”语句,但这不适用于本地范围。就我而言,我有一个类,并且在许多公共方法中都使用Socket。当连接结束时,很容易配置Socket,但是如果在没有“ using”块的情况下抛出异常,我该如何配置它呢?

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

但是我想知道是否还有更好的选择。如果不好的话,我可以不向图书馆使用者隐藏这种自动处置方法。

public class Foo
{
    Socket _socket;

    public void method1()
    {
         try
         {
              // some work with _socket
         }
         catch
         {
             _socket.Dispose();
             throw;
         }
    }
}
c# dispose idisposable using-statement
1个回答
0
投票

例如,您应该在构造函数中创建套接字并在析构函数中对其进行处置,否则在捕获到第一个异常(如method1一样后,您将引用一个可以继续使用的处置对象...

public class Foo
{
  Socket _socket;

  public Foo()
  {
    _socket = new Socket();
  }

  ~Foo()
  {
    _socket.Dispose();
  }

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

理想情况下,应该将Foo标记为实现IDispose,并在Dispose方法中处置套接字。

© www.soinside.com 2019 - 2024. All rights reserved.