【问题标题】:Difference between initiating sql object inside "using" statement and decorating with using statement [duplicate]在“using”语句中启动 sql 对象和使用 using 语句进行装饰之间的区别 [重复]
【发布时间】:2016-08-08 14:31:26
【问题描述】:

我怀疑通过在同一代码块中以不同方式应用“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;

【问题讨论】:

  • 这不是asp.net-mvc 特定或sql-server 特定问题。只是c#。此外,请在发布前多花 10 秒时间格式化代码以提高可读性。 :)
  • 实际上我在 MVC 框架中工作,认为有人可能会遇到这种情况
  • @soykan 我知道 using 语句及其好处,我正在遵循第一个示例代码块 1 ,突然当我看到示例代码块 2 时,我无法区分系统将如何过程,哪个是最好的遵循和实践。
  • @Ehsan sajjad 我知道 using 语句我试图单独询问两个代码块之间的区别

标签: c# using


【解决方案1】:

using 语句是释放资源(例如内存或句柄)的语法糖,无需自己编写代码。所以像sn-p这样的代码

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语句中包含代码。

您要求最佳实践(这通常是个人喜好问题)。在大多数情况下,最好使用第一个 sn-p(包含所有 using 语句),因为它会立即释放不再需要的所有资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2014-06-18
    • 1970-01-01
    • 2011-03-05
    • 2010-10-22
    • 1970-01-01
    • 2019-02-05
    相关资源
    最近更新 更多