C# 是否使用此函数处理SqlConnection
我的问题是,如果删除最后一块代码,垃圾收集器在处理SQlConnection对象时会关闭连接吗 我知道直言不讳是更好的做法,但我的同事不同意 垃圾收集器在处理数据时是否会关闭连接 SQlConnection对象 垃圾收集器不负责对对象调用C# 是否使用此函数处理SqlConnection,c#,dispose,sqlconnection,C#,Dispose,Sqlconnection,我的问题是,如果删除最后一块代码,垃圾收集器在处理SQlConnection对象时会关闭连接吗 我知道直言不讳是更好的做法,但我的同事不同意 垃圾收集器在处理数据时是否会关闭连接 SQlConnection对象 垃圾收集器不负责对对象调用Dispose,通常在终结器中调用Dispose,只有这样GC才能正确地处理该对象 需要注意的一点是,您无法预测垃圾收集进程何时运行,因此最好显式地处理对象(实现IDisposable) 就数据库连接而言,该方法应尽可能晚地打开,并尽可能早地关闭 在上述情况下c
Dispose
,通常在终结器中调用Dispose
,只有这样GC才能正确地处理该对象
需要注意的一点是,您无法预测垃圾收集进程何时运行,因此最好显式地处理对象(实现IDisposable
)
就数据库连接而言,该方法应尽可能晚地打开,并尽可能早地关闭
在上述情况下cx.Close()
应该足够了,相反,您也可以调用cx.Dispose
,,但更好的方法是将SqlConnection
包含在块中
这将转换为
try/finally
块,它将确保SqlConnection
处理 垃圾收集将处理它,但由于它是不确定的,所以您不知道它何时处理
C#提供使用
结构来处理非托管代码,建议使用它:
public CategorieEquipement Select(int NoType)
{
SqlConnection cx = new SqlConnection(WebConfigurationManager.ConnectionStrings["SQLConnect"].Connection String);
SqlDataReader reader;
CategorieEquipement lstCategorie = new CategorieEquipement();
try
{
cx.Open();
SqlCommand com = new SqlCommand("SELECT_CategorieEquip", cx);
com.CommandType = System.Data.CommandType.StoredProcedure;
com.Parameters.AddWithValue("@where",NoType);
reader = com.ExecuteReader();
while (reader.Read())
{
lstCategorie.CodeRef = reader["CodeRef"].ToString();
}
}
catch (Exception ex)
{
Debug.WriteLine("SELECT ERROR : " + ex.ToString());
return null;
}
finally
{
if (cx != null)
{
cx.Close();
}
}
return lstCategorie;
}
}
告诉您的同事,他们应该使用将实现IDisposable接口的对象的任何实例包装成一个
,以便以确定的方式对其进行处理,以确保正确管理应用程序资源并避免内存泄漏等问题。您的同事错了为什么不包装Sql对象使用(){}
来利用自动处理的优势。。GC也不总是即时的。。我也同意@Steve的观点也许你不需要依赖你的奶牛工人给你有缺陷的建议/信息为什么不保持原样,代码看起来很好。。。
using (SqlConnection cx = new SqlConnection(WebConfigurationManager.ConnectionStrings["SQLConnect"].ConnectionString);)
{
}