我有一个有DbConnection
变量的类。在类构造函数中,我为其分配了一个新DbConnection
实例。既然它是一个IDisposable
,我应该在我班级的析构函数(或其他地方)对它做些什么吗?
我知道如果使用它是一段代码,我应该将它包装在一个using
块中,我不知道为什么,但在这里我将它分配一次并将它用于我的班级的所有调用。
如果有什么不同,我使用的是 C# 4.0。
我有一个有DbConnection
变量的类。在类构造函数中,我为其分配了一个新DbConnection
实例。既然它是一个IDisposable
,我应该在我班级的析构函数(或其他地方)对它做些什么吗?
我知道如果使用它是一段代码,我应该将它包装在一个using
块中,我不知道为什么,但在这里我将它分配一次并将它用于我的班级的所有调用。
如果有什么不同,我使用的是 C# 4.0。
既然它是一个 IDisposable,我应该在我班级的析构函数(或其他地方)用它做点什么吗?
不,通常您不会有终结器/析构函数 -现代 .NET 几乎不需要它们。
但是,您的类应该实现IDisposable
并在那里处理数据库连接。这样,您基本上将处置的责任转嫁给了创建您的类的实例的人。
所有处理非托管资源的类都实现IDisposable
. 这样,您可以确保非托管资源在使用using() {}
或调用- 方法后被释放Dispose
。
来自MSDN
IDisposable Interface - Defines a method to release allocated resources.
这篇文章可能会有所帮助 -实现 Dispose 方法
基本上,实现IDisposable
的类依赖于一些资源,这些资源在不再需要时需要被炒掉。在您的情况下,这是与数据库的连接。始终保持连接打开是不明智的。如果您在块内使用它using
- 它将在块的末尾处理对象(它是try finally
构造的语法糖)。如果您将其作为对象字段/属性 - 最好的想法是让您的班级也实现IDisposable
并确保您班级的用户正确处理它。
旁注 - 您可以在终结器中处理您的对象,但对于正常的工作流程,强烈建议不要这样做,所以请不要这样做。
使用“使用”代码块围绕您的 dbconnection 自动处理任何打开的连接
using(sqlConnection conn=new SqlConnection(connectionstring)){
//rest of the code here
}