C# 使用来处置资源

C# 使用来处置资源,c#,.net,using-statement,C#,.net,Using Statement,可能重复: 我真的读过所有其他帖子,但没有人真正回答我的问题 这是我返回表的函数 public DataTable ReturnTable() { DataTable dt = new DataTable(); using (SqlConnection con = new SqlConnection(mainConnectionString)) { co

可能重复:

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

这是我返回表的函数

        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;
        }
上一个相对于下一个(我在发现“使用”之前一直使用的那个)有什么好处:

对于第二个问题,con、cmd和da的处理是否正确? 第二个有什么问题吗


谢谢

优点是
使用
模式调用
IDisposable
接口上的
Dispose()
方法,确保您可能遗漏的任何清理逻辑得到正确执行,即使引发异常也是如此


实际上,实现
IDisposable
的对象保留在非托管资源上,当调用
Dispose()
时,这些资源将被清除。因此,调用
Close()
可能是不够的。

的优点是使用
模式调用
IDisposable
接口上的
Dispose()
方法,确保您可能错过的任何清理逻辑得到正确执行,即使引发异常也是如此

实际上,实现
IDisposable
的对象保留在非托管资源上,当调用
Dispose()
时,这些资源将被清除。因此,调用
Close()
可能是不够的

第二个有什么问题吗

只要您的代码中没有出现异常,这对
con
也是一样的,因为在这种情况下
Close()
Dispose()
实际上是相同的。它不会立即处理
da
cmd
,并将等待它们被垃圾收集以释放其资源

<>代码<>使用的优点是,即使在异常的情况下,或者在方法的早期退出时,您的资源仍然被设置(在方法的中间添加“<代码>返回< /代码>”)。 第二个有什么问题吗

只要您的代码中没有出现异常,这对
con
也是一样的,因为在这种情况下
Close()
Dispose()
实际上是相同的。它不会立即处理
da
cmd
,并将等待它们被垃圾收集以释放其资源

<>代码<>使用的优点是,即使在异常的情况下,或者在方法的早期退出时,您的资源仍然被处理(在方法的中间添加“<代码>返回< /代码>”。

< P>不,它们不相同。这就是使用
的全部要点

如果代码抛出异常会发生什么?这些对象在垃圾收集器找到它之前不会被处理。

不,它们不一样。这就是使用
的全部要点


如果代码抛出异常会发生什么?在垃圾收集器找到这些对象之前,这些对象不会被释放。

本例中的“使用”尝试实现该模式,这在处理有限资源(如数据库连接)时特别有用。

本例中的“使用”尝试实现该模式,这在处理有限资源(如数据库连接)时特别有用。

连接对象是要关闭或处理的最重要对象,因为它包含物理数据库资源。在第二种情况下,如果存在异常,则在GC完成对象之前,它不会关闭。处理命令和数据适配器是一个非常好的主意,但不是那么关键。连接对象是最重要的要关闭或处理的对象,因为它拥有物理数据库资源。在第二种情况下,如果存在异常,则在GC完成对象之前,它不会关闭。处理命令和数据适配器是一个非常好的主意,但没有那么重要。
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;
            }