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;
}