带有using语句的SqlCommand

我看到在大多数样本中,SqlCommand都是这样使用的

using (SqlConnection con = new SqlConnection(CNN_STRING)) { using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con)) { SqlDataAdapter da = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); da.Fill(ds); return ds; } } 

我知道为什么我们使用“使用”声明。 但是SqlCommand没有包含Close()方法,所以我们应该在using语句中使用它

因为它还实现了IDisposable

Using语句的目的是当控件到达使用结束时它将配置使用块的对象并释放内存。 它的目的不仅仅是自动连接关闭,基本上它会配置连接对象,显然连接也因此而关闭。

其目的是释放我们在Using语句中使用的资源。

根据MSDN:

通常,当您使用IDisposable对象时,您应该在using语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法,并且(如前所示使用它时)一旦调用Dispose ,它也会导致对象本身超出范围。 在using块中,该对象是只读的,不能修改或重新分配。

using语句确保即使在对象上调用方法时发生exception,也会调用Dispose 。 您可以通过将对象放在try块中然后在finally块中调用Dispose来实现相同的结果; 实际上,这就是编译器如何翻译using语句。 之前的代码示例在编译时扩展为以下代码(请注意额外的花括号以创建对象的有限范围):

注意:

您可以实例化资源对象,然后将变量传递给using语句,但这不是最佳实践。 在这种情况下,在控制离开使用块之后,对象仍然在范围内,即使它可能不再能够访问其非托管资源。 换句话说,它将不再完全初始化。 如果您尝试使用using块之外的对象,则可能会导致抛出exception。 因此,通常最好在using语句中实例化对象,并将其范围限制为using块。

SqlCommand确实实现了IDisposable ,在使用块完成之前,using语句将调用.Dispose() 。 我不确定SqlCommand.Dispose()是做什么的,但最好在你完成的实例上调用.Dispose() ,即它可能会清理数据库连接。