C# 可识别的理解

C# 可识别的理解,c#,.net,idisposable,C#,.net,Idisposable,我有一个类,它有一个DbConnection变量。在类构造函数中,我为它分配了一个新的DbConnection实例。既然它是一个IDisposable,我应该在类的析构函数中(或其他地方)对它做些什么吗? 我知道,如果使用它作为一段代码,我应该用using块将其包装在中,但我不知道为什么,但在这里我只分配一次,并将其用于我的类的所有调用 如果有什么不同的话,我使用的是C#4.0。所有处理非托管资源的类都实现了IDisposable。通过这种方式,您可以通过使用(){}或调用Dispose-方法来

我有一个类,它有一个
DbConnection
变量。在类构造函数中,我为它分配了一个新的
DbConnection
实例。既然它是一个
IDisposable
,我应该在类的析构函数中(或其他地方)对它做些什么吗?
我知道,如果使用它作为一段代码,我应该用
using
块将其包装在
中,但我不知道为什么,但在这里我只分配一次,并将其用于我的类的所有调用


如果有什么不同的话,我使用的是C#4.0。

所有处理非托管资源的类都实现了
IDisposable
。通过这种方式,您可以通过
使用(){}
或调用
Dispose
-方法来确保非托管资源在使用后被释放

既然它是一个IDisposable,我应该在类的析构函数(或其他地方)中使用它吗

不,通常不会有终结器/析构函数-它们是


但是,您的类应该实现
IDisposable
,并在那里处理数据库连接。这样,您基本上是将处理的责任转交给创建类实例的人。

本文可能会有所帮助-

基本上,实现
IDisposable
的类依赖于一些资源,当不再需要这些资源时,需要对这些资源进行优化。在您的情况下,这就是到数据库的连接。始终保持连接打开是不明智的。如果您在
using
块中使用它,它将在块的末尾处理对象(这是
try finally
构造的语法糖)。如果将其作为对象字段/属性保存,那么最好的方法是让您的类也实现
IDisposable
,并确保类的用户正确地处理它


旁注-您可以在终结器中处理对象,但对于正常的工作流,强烈建议不要这样做。

使用“使用”代码块自动处理任何打开的连接

using(sqlConnection conn=new SqlConnection(connectionstring)){
//rest of the code here
}

当我的类被销毁时,
Dispose
不会被自动调用吗?不,不会。您必须对其手动调用.Dispose(),或者将其包装在using语句中(当块退出时,using语句将对其调用.Dispose())。在您的情况下,您应该使用Jon的建议并使您的类实现IDisposable,然后在完成后使用上述方法之一来处理它。
using(sqlConnection conn=new SqlConnection(connectionstring)){
//rest of the code here
}