提问人:James Madison 提问时间:3/3/2016 最后编辑:James Madison 更新时间:3/3/2016 访问量:96
如果对象位于 using 块中,则将 SqlConnecions 作为私有字段的对象是否会关闭?
Do objects with SqlConnecions as private fields get closed if the object is in an using block?
问:
我知道在如下所示的 using 块中使用 SqlConnection 将在 using 块的末尾关闭连接。
using (var connection = factory.NewSqlConnection())
{
//code
}
我想知道具有 SqlConnection 私有字段并在 using 语句中使用的对象是否也会像这样关闭连接:
using (var db = factory.NewDatabaseManager())
{
//code
}
public class DatabaseManager
{
private SqlConnection _connection;
public DatabaseManager(SqlConnection connection)
{
_connection = connection;
}
}
答:
2赞
Tony Vitabile
3/3/2016
#1
如果我理解正确的话,该类是在语句内部使用的,因此它必须实现,因此有自己的方法。DatabaseManager
using
IDisposable
Dispose
在这种情况下,仅当类中的方法调用对象的方法时,才会释放该对象。没有任何魔法可以做到这一点。您的代码必须正确管理,否则您将遇到问题。SqlConnection
Dispose
DatabaseManager
SqlConnection
Dispose
SqlConnection
评论
0赞
James Madison
3/3/2016
DatabaseManager 没有实现 IDisposable,应该吗?
1赞
Tony Vitabile
3/3/2016
如果你要在语句中使用它,它必须这样做。编译器不允许你在语句中使用它,除非它实现了 .考虑到你要做的事情,它绝对应该。using
using
IDisposable
0赞
RiceRiceBaby
3/3/2016
不要忘记关闭 DatabaseManager 类的 dispose 方法上的 sql 连接,就像 Tony 说的那样。
2赞
Igor
3/3/2016
#2
它可以,但你必须编写代码才能做到这一点。下面是 DatabaseManager 现在实现 IDisposable 的示例。之前,using 语句会给你一个编译时错误,因为它没有实现它。
下面也被称为 a ,而不是完全是另一回事。_connection
field
attribute
在开始在类型中实现 IDisposable 之前,请参阅实现 IDisposable 的正确方法,因为它永远不会引发异常。这是 Microsoft 对 Dispose 模式的看法,它是一个很好的清单,列出了该做什么和要避免什么。
using (DatabaseManager db = factory.NewDatabaseManager())
{
//code
}
public class DatabaseManager : IDisposable
{
private SqlConnection _connection;
public DatabaseManager(SqlConnection connection)
{
_connection = connection;
}
// basic implementation of IDisposable
public void Dispose() {
_connection.Dispose();
}
}
评论
1赞
Tony Vitabile
3/3/2016
有关如何实现一次性模式的 MSDN 文章的链接很方便,而且我以前没有读过。
上一个:将类名 = 命名空间,在使用
下一个:“使用”声明,范围仅在当前类上?
评论