SqlCommand with using语句

Ome*_*r K 20 c# sqlcommand sqlconnection using-statement

我看到在大多数样本中,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ehs*_*jad 29

因为它也实现了IDisposable.

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

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

根据MSDN:

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

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

注意:

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

  • 您可以检查Dispose()方法是否可以与它实现IDisposable的对象一起使用,否则它不会实现 (2认同)

Jas*_*ans 5

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

  • 多种方法-在Visual Studio中,一种方法转到实例的类型,然后右键单击该实例,选择“转到定义”。该窗口将告诉您该类型是否实现了“ IDisposable”。 (3认同)
  • 现在该源可用,您可以看到它的作用。虽然数量不多,但是它可以做一些事情:https://referencesource.microsoft.com/#System.Data/System/Data/SqlClient/SqlCommand.cs,53ad9885e5a8fc48 (2认同)