C# 当释放命令并且直接在命令上定义连接时,连接是否关闭?

C# 当释放命令并且直接在命令上定义连接时,连接是否关闭?,c#,using,using-statement,C#,Using,Using Statement,我知道有很多例子,其中定义了SqlConnection,然后定义了SqlCommand,这两种方法都是使用块: using (var conn = new SqlConnection(connString)) { using (var cmd = new SqlCommand()) { cmd.Connection = conn; //open the connection } } 我的问题:如果我直接在SqlCommand上定义连接,那

我知道有很多例子,其中定义了SqlConnection,然后定义了SqlCommand,这两种方法都是使用块:

using (var conn = new SqlConnection(connString)) {
      using (var cmd = new SqlCommand()) {
        cmd.Connection = conn;
        //open the connection
      }
}
我的问题:如果我直接在SqlCommand上定义连接,那么在释放该命令时连接是否关闭

using (var cmd = new SqlCommand()) {
      cmd.Connection = new SqlConnection(connString);
      //open the connection
}

否,SqlCommand从不尝试关闭/释放连接。

否,除非您显式地释放连接对象,否则不会释放连接对象。但我的建议是尽可能使用使用块

它不会关闭连接,您需要自己关闭它或将它放在自己的using station中

这里还有一个技巧,可以让您的
使用
块更具可读性:

using (var conn = new SqlConnection(connString))
using (var cmd = new SqlCommand())
{
    cmd.Connection = conn;
}
@米洛特

但我的建议是尽可能使用块

使用块很好,但在处理不可标识的对象时没有用,因此如果在任何地方使用块,这可能会令人困惑

要小心,因为如果对象没有实现IDisposable,它们可能不会被处置


希望这有帮助。

非常好,安德鲁,我以前从未见过这种组合。我得试一下。我总是嵌套多个“使用块”,这有时会使代码更难阅读。IMO,这会降低代码的可读性。我不介意丢失大括号和嵌套,尤其是当sloppier JR开始使用东西时。嗯,我认为编译器不会允许你使用“使用”不实现IDisposable的对象的块。我模模糊糊地记得上一次尝试编译时出现了一个编译错误,那是几年前的事了。
使用块很好,但是在处理不可IDisposable对象时没有用
,你不能对不可IDisposable对象使用
使用