是否可以在using语句之上而不是在括号中声明对象

Som*_*197 18 c#

C#中using语句的大多数示例都在括号内声明对象,如下所示:

using (SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", connection))
{
   // Code goes here
}
Run Code Online (Sandbox Code Playgroud)

如果我使用using语句以下方式使用using语句之外的对象会发生什么:

SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", connection);
using (cmd)
{
   // Code goes here
}
Run Code Online (Sandbox Code Playgroud)

以第二个例子中的方式使用using语句是一个坏主意,为什么?

Ric*_*ard 15

在using语句的控制表达式中声明变量会将变量的范围限制在using语句中.在第二个示例中,变量cmd可以在using语句之后继续使用(当它将被释放时).

通常,建议仅将变量用于一个目的,限制其范围允许稍后在范围内使用具有相同名称的另一个命令(可能在另一个使用表达式中).也许更重要的是,它告诉读者您的代码(并且维护比初始编写需要更多的努力),cmd而不是在using语句之外使用:您的代码更容易理解.


Ada*_*rth 6

是的,这是有效的 - 对象仍将以相同的方式处理,即在结束时,如果执行流程试图离开块(返回/异常).

但是,如果您尝试在之后再次使用它using,它将被处理掉,因此您无法知道该实例是否可以安全继续使用,因为dispose不必重置对象状态.此外,如果在构造期间发生异常,它将不会遇到using阻塞.

我将在语句中声明并初始化变量以定义其范围. 如果您使用的using话,机会非常好,您不需要它超出范围.

MemoryStream ms = new MemoryStream(); // Initialisation not compiled into the using.

using (ms) { } 

int i = ms.ReadByte(); // Will fail on closed stream.
Run Code Online (Sandbox Code Playgroud)

以下是有效的,但在大多数情况下有些不必要:

MemoryStream ms = null;

using (ms = new MemoryStream())
{ }

// Do not continue to use ms unless re-initializing.
Run Code Online (Sandbox Code Playgroud)

  • 它将可用但不可用 - 它的内部状态将被处理掉.您不知道内部状态是什么或者dispose如何影响类的实例,所以它不是一个安全的过程.我没有说它不可用,-1不适用. (2认同)