启动sql对象内部的区别"使用"声明和使用声明装饰

时间:2016-08-08 14:31:27

标签: c# using

我怀疑使用"使用"有什么重大区别?在同一个代码块中以不同的方式声明,知道练习对我来说是最好的方法 sameple 1代码块

using (SqlConnection SqlConnection = new SqlConnection(dbConnectionString))
                 {
                     SqlConnection.Open();
                     using (var command = new SqlCommand(store_procName, SqlConnection))
                     {
                         command.Parameters.Add(Constants.PARAM_Value, SqlDbType.VarChar).Value = Id;
                         command.CommandType = CommandType.StoredProcedure;
                         using (var adp = new SqlDataAdapter(command))
                         {
                             adp.Fill(dtValid);
                         }
                     }
                 }
                 return dtValid;

示例代码块2

using (SqlConnection SqlConnection = new SqlConnection(dbConnectionString))
                 {
                     SqlConnection.Open();
                     SqlCommand command = new SqlCommand(store_procName, SqlConnection);                     
                     command.Parameters.Add(Constants.PARAM_Value, SqlDbType.VarChar).Value = Id;
                     command.CommandType = CommandType.StoredProcedure;
                     SqlDataAdapter adp = new SqlDataAdapter(command);
                     adp.Fill(dtValid);                       

                 }
                 return dtValid;

1 个答案:

答案 0 :(得分:1)

using语句是释放资源(例如内存或句柄)的语法糖,而不必自己编写代码。所以像

这样的代码片段
using (var adp = new SqlDataAdapter(command))
{
    adp.Fill(dtValid);
}

转换为之类的内容

SqlAdapter adp = null;
try
{
    adp = new SqlDataAdapter(command);
    adp.Fill(dtValid);
}
finally
{
    if (adp != null) adp.Dispose();
    // or rather (adp as IDisposable)?.Dispose();
}

(这只是一个给出这个想法的例子,不一定是编译器生成的确切代码)。

因此,如果您在代码中省略了内部using语句,则此时将不会调用实例的Dispose()方法。最终垃圾收集将清理这些对象(通常会调用Dispose())。

如果您对此方法进行了大量调用并读取了大量数据,那么差异是相关的,因此SqlCommandSqlDataAdapter会占用大量资源。如果您想尽快发布这些资源,则应将代码包含在using语句中。

您要求最佳实践(这通常是品味的问题)。在大多数情况下,第一个代码段(包含所有using语句)更可取,因为它会立即释放不再需要的所有资源。