我正在编写一个包含套接字操作的类库。我不想依靠使用者在完成处理后或引发异常时处置资源。
通常,我会使用“ using”语句,但这不适用于本地范围。就我而言,我有一个类,并且在许多公共方法中都使用Socket。当连接结束时,很容易配置Socket,但是如果在没有“ using”块的情况下抛出异常,我该如何配置它呢?
这是我想出的:基本上,我用try catch块封装了用户可以访问的每种方法。如果发生异常,则在将异常抛出给用户之前,我会处理资源。
但是我想知道是否还有更好的选择。如果不好的话,我可以不向图书馆使用者隐藏这种自动处置方法。
public class Foo
{
Socket _socket;
public void method1()
{
try
{
// some work with _socket
}
catch
{
_socket.Dispose();
throw;
}
}
}
例如,您应该在构造函数中创建套接字并在析构函数中对其进行处置,否则在捕获到第一个异常(如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方法中处置套接字。