使用处理资源

时间:2012-12-14 23:27:13

标签: c# .net using-statement

  

可能重复:
  Trying to understand the ‘using’ statement better

我真的读了所有其他帖子,但没有人真正回答我的问题。

这是我的函数,它返回一个表

        public DataTable ReturnTable()
        {
            DataTable dt = new DataTable();   
            using (SqlConnection con = new SqlConnection(mainConnectionString))
            {
                con.Open();                             
                using (SqlCommand cmd = new SqlCommand())
                {
                    cmd.CommandType = CommandType.Text;    
                    SQL = " SELECT * from table";                        
                    cmd.CommandText = SQL;                                            
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(dt);
                    }
                }
            }           
            return dt;
        }

之前针对以下内容的优势是什么(我在发现'使用'之前总是使用的那个):

public DataTable ReturnTable()
            {
                DataTable dt = new DataTable();   
                SqlConnection con = new SqlConnection(mainConnectionString);
                con.Open();                             
                SqlCommand cmd = new SqlCommand();
                cmd.CommandType = CommandType.Text;    
                SQL = " SELECT * from table";                        
                cmd.CommandText = SQL;                                            
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(dt);
                con.Close();
                return dt;
            }

用秒,是不是con,cmd和da妥善处理? 第二个问题有什么问题吗?

谢谢!

4 个答案:

答案 0 :(得分:4)

  

第二个是否有问题?

只要您的代码中没有异常,这对con的工作方式就会一样,因为Close()Dispose()实际上是相同的 in这种情况。它不会立即处理dacmd,并会等到它们被垃圾收集以释放资源。

using的优势在于,即使在异常或提前退出方法的情况下(您在方法中间添加了return),您的资源仍会被处理。

答案 1 :(得分:0)

优点是using模式调用Dispose()接口上的IDisposable方法,保证您可能错过的任何清理逻辑被正确执行,即使抛出异常。

实际上,实现IDisposable的对象会持有非托管资源,这些资源会在调用Dispose()时被清除。因此,调用Close()可能还不够。

答案 2 :(得分:0)

不,他们相同。这就是using的整个

如果您的代码抛出异常会怎样?在垃圾收集器碰巧碰到它之前,这些对象不会被丢弃。

答案 3 :(得分:0)

在这种情况下,

“using”in尝试实现RAII模式,这在处理数据库连接等有限资源时特别有用。