在 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 实例上的一个字段。
问题是 SqlConnection
是 IDisposable
。因此,如果您的 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.
我在 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 实例上的一个字段。
问题是 SqlConnection
是 IDisposable
。因此,如果您的 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.