使用语句变体

Jas*_*des 0 c# ado.net using

我发现我的代码库包含各种数据访问代码,其中我以两种不同的方式使用using语句.哪个是更好的方式,这两种方法有什么不同?在using语句中不实例化SqlConnection和SqlCommand可能引起的任何问题?忽略明显的不一致问题.

方法1:

public int SampleScalar(string query, CommandType queryType, SqlParameter[] parameters)
    {
        int returnValue = 0;
        SqlConnection objConn = new SqlConnection(ConnString);
        SqlCommand objCmd = new SqlCommand(query, objConn);
        objCmd.CommandType = queryType;

        if (parameters.Length > 0)
            objCmd.Parameters.AddRange(parameters);

        using (objConn)
        {
            using (objCmd)
            {
                objConn.Open();
                try
                {
                    returnValue = (int)objCmd.ExecuteScalar();
                }
                catch (SqlException e)
                {
                    Errors.handleSqlException(e, objCmd);
                    throw;
                }
            }
        }
        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)

方法2:

public int SampleScalar2(string query, CommandType queryType, SqlParameter[] parameters)
    {
        int returnValue = 0;
        using (SqlConnection objConn = new SqlConnection(ConnString))
        {
            using (SqlCommand objCmd = new SqlCommand(query, objConn))
            {
                objConn.Open();
                objCmd.CommandType = queryType;

                if (parameters.Length > 0)
                    objCmd.Parameters.AddRange(parameters);
                try
                {
                    returnValue = (int)objCmd.ExecuteScalar();
                }
                catch (SqlException e)
                {
                    Errors.handleSqlException(e, objCmd);
                    throw;
                }
            }
        }
        return returnValue;
    }
Run Code Online (Sandbox Code Playgroud)

Ser*_*rvy 5

在第一个片段中,如果在IDisposable创建对象之后和开始使用之前发生任何异常,则将无法正确处理.在第二个实施中,没有这样的差距可能导致未发布的资源.

第一种方法可能出现的另一个问题是,您可以在处置后使用对象,这可能不会很好地结束.

您可能确保不会发生任何异常,也许您不是.一般来说,我永远不会使用第一种方法,因为我不相信自己(或任何其他人)永远不会在那个没有保护的空间中犯错误.如果不出意外,我需要花费时间和精力寻找非常密切的是肯定是什么都不能出差错.你也没有从使用那种不太安全的方法中获得任何好处.