SqlConnection 是否使用此函数进行处置

本文关键字:函数 是否 SqlConnection | 更新日期: 2023-09-27 18:21:46

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;
    }
}

我的问题是,如果我删除最后的代码块,垃圾回收器会在处理 SQlConnection 对象时关闭连接吗?

我知道明确是更好的做法,但我的同事不同意.

SqlConnection 是否使用此函数进行处置

垃圾回收器在处置 SQl连接对象?

垃圾回收器不负责在对象上调用Dispose,通常在终结器中调用Dispose,只有这样 GC 才能正确处置对象。

需要注意的重要一点是,您无法预测垃圾回收过程何时运行,因此最好显式释放对象(实现IDisposable(。

就数据库连接而言,该方法应尽可能晚地打开并尽可能早地关闭。

在上面的情况下cx.Close();应该足够了,相反,你也可以调用cx.Dispose但更好的方法是SqlConnection括在语句块using

这将转化为try/finally块,它将确保SqlConnection处置。

垃圾回收将处理它,但由于它是非确定性的,您不知道它何时会这样做。

C# 提供了用于释放非托管代码的using结构,建议使用它:

using (SqlConnection cx = new SqlConnection(WebConfigurationManager.ConnectionStrings["SQLConnect"].ConnectionString);)
{
}

告诉您的同事,他们应该将实现 IDisposable 接口的任何对象实例包装在using中,以便以确定性的方式处置它们,以确保正确管理应用程序资源并避免内存泄漏等问题。