IDisposable 是否总是需要处理掉?
Does IDisposable always have to be disposed?
我有一个 class,其中包含受保护的 IDbConnection
属性。在这个 class 中,我有一个函数可以 return 打开 IDbConnection
。因此,我认为 class 也应该实施 IDisposable
class 以确保 IDbConnection
得到正确处理。
这就是我的 class 的样子 -
public class MyConnection : IDisposable
{
protected IDbConnection _connection;
protected string _connectionString;
public IDbConnection OpenConnection()
{
_connection = new SqlConnection(_connectionString);
_connection.Open();
return _connection;
}
public void Dispose()
{
if(_connection != null)
{
_connection.Dispose();
}
}
}
我的使用方式是-
MyConnection mc = new MyConnection();
using(var cnn = mc.OpenConnection())
{
// do stuff with cnn
}
这应该处理连接完成后的处理。关于这个的几个问题 -
IDisposable
继承对于 MyConnection
是必要的吗?我的想法是,这只是最佳实践,因为您可能会在 class 控件之外打开连接。
- 如果需要
IDisposable
,我是否应该像这样使用它 -
处理掉两者
using(var mc = new MyConnection())
{
using(var cnn = mc.OpenConnection())
{
// do stuff
}
}
正如评论中所指出的那样,您所拥有的应该命名为 MyConnectionFactory
,因为它就是这样做的。
由于您要返回连接,因此需要处理的是连接,而不是工厂本身。所以你的用例
MyConnectionFactory mc = new MyConnectionFactory();
using(var cnn = mc.OpenConnection())
{
// do stuff with cnn
}
是正确的方法。处置 mc
在这里没有任何用处,因为它处置了 是 实际上已经处置的成员。您甚至应该从 class 中删除成员 _connection
,因为它并不能真正帮助您保留它,因为调用者会清理它。也就是说,除非您想保持连接打开,否则调用方 绝不能 处理它。
我有一个 class,其中包含受保护的 IDbConnection
属性。在这个 class 中,我有一个函数可以 return 打开 IDbConnection
。因此,我认为 class 也应该实施 IDisposable
class 以确保 IDbConnection
得到正确处理。
这就是我的 class 的样子 -
public class MyConnection : IDisposable
{
protected IDbConnection _connection;
protected string _connectionString;
public IDbConnection OpenConnection()
{
_connection = new SqlConnection(_connectionString);
_connection.Open();
return _connection;
}
public void Dispose()
{
if(_connection != null)
{
_connection.Dispose();
}
}
}
我的使用方式是-
MyConnection mc = new MyConnection();
using(var cnn = mc.OpenConnection())
{
// do stuff with cnn
}
这应该处理连接完成后的处理。关于这个的几个问题 -
IDisposable
继承对于MyConnection
是必要的吗?我的想法是,这只是最佳实践,因为您可能会在 class 控件之外打开连接。- 如果需要
IDisposable
,我是否应该像这样使用它 -
处理掉两者
using(var mc = new MyConnection())
{
using(var cnn = mc.OpenConnection())
{
// do stuff
}
}
正如评论中所指出的那样,您所拥有的应该命名为 MyConnectionFactory
,因为它就是这样做的。
由于您要返回连接,因此需要处理的是连接,而不是工厂本身。所以你的用例
MyConnectionFactory mc = new MyConnectionFactory();
using(var cnn = mc.OpenConnection())
{
// do stuff with cnn
}
是正确的方法。处置 mc
在这里没有任何用处,因为它处置了 是 实际上已经处置的成员。您甚至应该从 class 中删除成员 _connection
,因为它并不能真正帮助您保留它,因为调用者会清理它。也就是说,除非您想保持连接打开,否则调用方 绝不能 处理它。