在 C# 中程序完成后,在 类 析构函数中关闭 SqlConnection 是否安全?

Is it safe to have a SqlConnection close in a classes destructor upon program completion in C#?

我在 C# 中有一个名为 SQLServerConnection 的 class,它包含一个 SqlConnection 对象。 class 使用 SqlConnection 实例连接到 SQLServer。 class 有一个析构函数如下:

~SQLServerConnection()
{
    dbConnection.Close();
}

程序完成后,在 dbConnection.Close() 处抛出错误,错误如下:

System.InvalidOperationException: 'Internal .Net Framework Data Provider error 1.'

知道为什么会这样吗?如果我在主 class 中正常调用 Close() 这工作正常但如果在析构函数中完成只会抛出错误。

此外,像这样在析构函数中关闭连接是不好的做法吗?

您似乎希望 class 封装开箱即用的 SqlConnection class,因为它包含 SqlConnection 的一个实例 dbConnection 我假设它是 class 实例上的一个字段。

问题是 SqlConnectionIDisposable。因此,如果您的 class 想要在一个字段中保存它的一个实例,这意味着 您的 class 也应该是 IDisposable。来自 Microsoft 的 CodeAnalysis 规则(字面意思是规则 1001),参见 Types that own disposable fields should be disposable.

您可能还想注意该页面上的行:

If the class does not directly own any unmanaged resources, it should not implement a finalizer.