我知道以下语句对垃圾收集很有用。实际上它必须与Try / Catch / finally相同。如果我将它用于sql连接,我还应该为sql适配器嵌套一个'using'语句吗?然后进一步嵌套使用DataSet?
using()
{
}
问题的另一个补充是,如果我想在多个方法中使用相同的连接,那么最好在每个方法中使用“Using()”,或者我可以只创建一次这个连接对象吗? / p>
答案 0 :(得分:9)
其他值得指出的是,您可以将多个using
语句组合到一个块中,如下所示:
using (SqlConnection connection = new SqlConnection("connectionString"))
using (SqlCommand command = new SqlCommand("SELECT * FROM Users", connection))
{
// Do something here...
}
退出此块后(通过到达块的末尾或抛出异常),SqlConnection
和SqlCommand
对象都将自动处理。
答案 1 :(得分:5)
using
与try/catch/finally
不一样 !! using
确保在括号中的Dispose
对象上自动调用IDisposable
,所以
using (SqlConnection conn = new SqlConnection(...))
{
}
与
相同SqlConnection conn = new SqlConnection(...);
try
{
}
finally
{
conn.Dispose();
}
没有任何陷阱,没有错误被捕获!
如果你想要及时处理你创建的所有一次性对象,那么是的,你应该为每个对象使用using
块。
有时可能更容易阅读以创建try
块之外的所有内容,然后将所有内容都放在一个finally
块中(此示例将在Windows窗体应用程序中绘制。有时您需要你可以在try
之前创建它们,在块中使用它们并将它们放在finally
块中。
这基本上是编码风格的问题。
答案 2 :(得分:4)
是的,您应该使用using
语句来处置实现IDisposable
的所有内容。 using
语句不是关于垃圾收集,而是关于资源(除了内存)。 DataSet和SqlDataAdapter都是IDisposable
的实例。
using
块意味着您保证对象所持有的资源以及时,确定的方式处理。如果没有using
,则无法保证何时释放这些资源。这可能导致资源泄漏,例如文件句柄耗尽。
答案 3 :(得分:4)
using
语句用于实现IDisposable
接口的类的每个实例。它与GC(垃圾收集器)的关系是你的实例在GC执行之前释放它们的资源。这对共享资源非常有用,并且有助于并发。
至于你的问题,是的,你应该在Connection和Adapter上使用using语句。
对于try和catch块,与using语句没有相似之处。它们中的两个用于不同的目的。一个(使用)用于提前释放资源,另一个用于处理错误,无论是未预料到的还是预期的