【问题标题】:Confused using "using" Statement C#混淆使用“使用”语句 C#
【发布时间】:2010-10-26 08:11:53
【问题描述】:

根据MSDN Library

using Statement (C# Reference)
Defines a scope, outside of which an object or objects will be disposed.

但是我得到了一些用户在这里发布的代码,我对此感到困惑:(请参阅我对代码的评论)

using (OleDBConnection connection = new OleDBConnection(connectiongString))
           {
                if (connection.State != ConnectionState.Open)
                    connection.Open();
                string sql = "INSERT INTO Student (Id, Name) VALUES (@idParameter, @nameParameter)";

                using (OleDBCommand command = connection.CreateCommand())
                {
                    command.CommandText = sql;
                    command.CommandType = CommandType.Text;

                    OleDBParameter idParameter = command.CreateParameter();
                    idParameter.DbType = System.Int32;
                    idParameter.Direction = Parameterdirection.Input;
                    idParameter.Name = "@idParameter";
                    idParameter.Value = studentId; 

                    OleDBParameter nameParameter = command.CreateParameter();
                    try
                    {
                        command.ExecuteNonQuery();
                    }
                    finally
                    {
                        // Is it still necessary to dispose these objects here?
                        command.Dispose();
                        connection.Dispose();
                    }
                }
            }

在上述代码中,using 语句是否正确使用? 我很困惑,谁能解释一下如何使用using 语句及其范围以及何时、何地以及为什么使用它。谢谢。。

【问题讨论】:

    标签: c# using named-scope


    【解决方案1】:

    using 语句是手动放置try/finally 块的简写。

    所以

    using( x ){
      ...
    }
    

    是一样的

    try{
      ...
    }finally{
      if( x != null ){ x.Dispose(); }
    }
    

    并且它们在编译时会生成相同的 IL。

    如果x 没有实现IDisposable,编译器会给你一个错误。

    【讨论】:

    • 实际上等同于 if(x != null){ ((IDisposable)x).Dispose(); } - using 语句(C# 参考)bit.ly/acmoOD
    • 我感到很遗憾,因为我在你之前一分钟发布了我的答案,我(目前)获得了两倍的选票,这对 SO 来说并不是一个好兆头,你的问题并不逊于我的无论如何,但因为你画得不够快,它(可能)不会超过我的。
    • 我猜这就是目前 SO 的工作方式,我也不确定是否有快速的“修复”。可悲的是,它提倡快速回答,而不是经过深思熟虑的回答。我发现自己经常写一个快速的答案,即使我知道我以后需要对其进行编辑以免完全沉没。我已经考虑了一段时间,我的一个建议是,在发布问题后,10 分钟内不会显示任何答案,然后在 10 分钟后,在此时间范围内写入的所有答案都以随机顺序显示相同的时间戳。可能是个好主意;)
    • 这可能会将重点转移到在这 10 分钟内实际写出足够好的答案,以便在向公众展示答案时它会比其他答案更好,而不是仅仅将其“发布”有”,无论内容如何。我认为您对这个问题的回答也很好,因此我认为我们应该获得大约相同数量的选票。希望 SO 的工作人员经过深思熟虑后,采取一些措施来解决这些问题。
    【解决方案2】:

    finally 块(因此在本例中为 try)是多余的,这就是 using 所做的,它在 IDisposable 对象上调用 Dispose,当 using块结束(不管有没有例外)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-15
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多