3

如果我使用类似的东西:

using (OdbcConnection conn = new OdbcConnection(....))
{
  conn.open();
  my commands and sql, etc.
}

我必须做一个 conn.close(); 还是 using 语句使我无法进行最后一次通话?它会处理 using 块中的所有内容吗?例如,如果我调用其他不相关的对象,它是否也会自动处理这些对象?

谢谢你。在阅读了有关在 Microsoft 网站上使用的信息后,我不清楚。我想确保我没有任何内存泄漏。

4

3 回答 3

6
  1. using 块将处理 OdbcConnection。
  2. 正常范围规则适用于 using 块内声明的任何内容。
  3. using 块不会清理任何其他 IDisposable 对象。它只清理声明的项目
    • 请注意,您可以使用块进行嵌套,或者如果项目是相同的类型,则可以同时初始化多个项目。

有关如何在 C#中使用 using 关键字的更多信息,请参阅我的其他答案的顶部。

我还应该提到,您可以在完成连接以释放资源后立即关闭(处置)连接。指导方针说调用者应该能够重复调用 dispose 方法。using 块本质上只是一个安全网,允许在大多数情况下编写更清晰的代码。


[编辑] 例如 using 中的多个初始化:如果对象是相同的类型,则在同一 using 中初始化多个对象,而无需嵌套 using 块:

using (Bitmap b1 = new Bitmap("file1"), b2 = new Bitmap("file2")) 
{ ... }

Joel Coehoorn 提到了堆叠,这是嵌套但省略了大括号,就像您可以在for, orif语句中省略大括号一样。UI 不会使用缩进重新格式化。我很好奇IL是什么样的。

using(Bitmap b = new Bitmap("filex"))
using(Graphics g = Graphics.FromImage(b))
{ 
}

使用将不同的对象放在同一个使用中是错误的error CS1044: Cannot use more than one type in a for, using, fixed, or declaration statement.

// error CS1044
using(Bitmap b = new Bitmap("filex"), Graphics g = Graphics.FromImage(b)) 
于 2009-02-04T21:26:13.337 回答
4

using 语句将为您处理调用 Close 和 Dispose 方法。

Scott Hanselman对 using 语句有一个很好的解释。

于 2009-02-04T21:21:46.187 回答
1

using 语句确保实现 IDisposable 的对象被释放。它只会处理在 using 块中引用的对象,因此您的代码基本上等同于:

OdbcConnection conn = new ....;
try
{
   conn.open();
   conn.....
}
finally
{
   conn.dispose();
}
于 2009-02-04T21:27:21.900 回答