-3

我有一个关于在 C# 中关闭与数据库的打开连接的问题。假设我们放弃了“使用”方法并使用 try/catch/finally 块来打开和关闭连接。

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) 在此代码段中发生,究竟会发生什么。在释放(关闭)之前应该始终检查连接是否为空,但如果不是,我们尝试关闭一个为空的连接对象怎么办?(我对打开的连接会发生什么感兴趣,这会导致泄漏吗)

4

1 回答 1

0

在这个问题中,如果在没有检查的情况下在连接connection.Dispose()上调用null,则会导致一个尚未处理的新异常,以及随之而来的一切。此外,如果这样做是因为connection变量被设置nullfinally块之前而没有确保连接已关闭,则可能会泄漏该打开的连接......尽管实际上很少看到知道使用的野外代码afinally但也想将连接设置为null

考虑到缺乏using(这是可疑的,但无论如何),我更喜欢这种模式:

finally
{
    if (connection is IDisposable) connection.Dispose();
}

仍然可以防止对象中的null* connection,并且更接近于using模式已经在幕后所做的模拟。

但是请注意,您仍然缺少using块的一个重要功能,即防止null在块关闭之前分配给您的变量的东西。using块还在一个单独的(隐藏的)变量中保护您的连接,因此您确定在块的末尾仍然有一个有效的引用(这是 C# 8 中的新功能)。

* (为了完整起见,该链接推文的作者是 C# 编译器团队的负责人,所以他应该知道,他并不是在讽刺)。

于 2019-09-23T19:59:45.327 回答