我有一个关于关闭与 C# 中数据库的打开连接的问题。假设我们放弃了"using"方法,并使用try/catch/final块来打开和关闭连接。
try
{
connection = new SqlConnection();
connection.Open();
}
catch (Exception ex)
{
// Do whatever you need with exception
}
finally
{
1.connection.Dispose();
2.if (connection != null)
{
connection.Dispose();
}
}
我这里的问题是,如果此代码段中仅发生 1( 究竟会发生什么。在释放(关闭(之前,应始终检查连接是否为 null,但如果不是,并且我们尝试关闭一个 null 的连接对象怎么办?(我对打开的连接会发生什么感兴趣,这会导致泄漏吗(
在问题中,如果在没有检查的情况下在null
连接上调用connection.Dispose()
,则会导致尚未处理的新异常以及随之而来的所有异常。此外,如果这样做是因为connection
变量在finally
块之前设置为null
而没有确保连接已关闭,则可能会泄漏打开的连接......尽管实际上很少看到知道使用finally
但也希望将连接设置为null
的代码。
考虑到缺乏using
(这是可疑的,但无论如何(,我更喜欢这种模式:
finally
{
if (connection is IDisposable) connection.Dispose();
}
这仍然可以防止connection
对象中的null
值*,并且更接近于模拟using
模式已经在后台执行的操作。
但是请注意,您仍然缺少using
块的一个重要功能,即防止在块关闭之前为变量分配null
。using
块还会在单独的(隐藏(变量中保护连接,因此请确保块末尾仍有有效的引用(这是 C# 8 中的新增内容(。
*(为了完整起见,该链接推文的作者是 C# 编译器团队的负责人,所以他应该知道,而且他不是在讽刺(。