在 "using" 语句中启动 sql 对象与使用 using 语句装饰之间的区别
Difference between initiating sql object inside "using" statement and decorating with using statement
我怀疑在同一代码块中以不同方式应用 "Using" 语句有什么显着差异,最好知道对我来说最好的做法
相同的 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;
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()
)。
如果你多次调用此方法并读取大量数据,那么SqlCommand
和SqlDataAdapter
会消耗大量资源,因此差异是相关的。如果你想尽快释放这些资源,你应该在using
语句中包含代码。
您要求的是最佳实践(这通常是品味问题)。在大多数情况下,第一个片段(包含所有 using
语句)更可取,因为它会立即释放所有不再需要的资源。
我怀疑在同一代码块中以不同方式应用 "Using" 语句有什么显着差异,最好知道对我来说最好的做法 相同的 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;
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()
)。
如果你多次调用此方法并读取大量数据,那么SqlCommand
和SqlDataAdapter
会消耗大量资源,因此差异是相关的。如果你想尽快释放这些资源,你应该在using
语句中包含代码。
您要求的是最佳实践(这通常是品味问题)。在大多数情况下,第一个片段(包含所有 using
语句)更可取,因为它会立即释放所有不再需要的资源。