using语句是否阻止我关闭或销毁对象?

时间:2009-02-04 21:20:37

标签: asp.net using

如果我使用类似的东西:

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

我是否必须做conn.close();或者使用声明是否阻止我做最后一次通话?它是否处理了使用块中的所有内容?例如,如果我将其他对象称为unlrelated,那么它是否也会自动消失?

谢谢。在阅读有关在微软网站上使用后,我不清楚。我想确保没有任何内存泄漏。

3 个答案:

答案 0 :(得分:6)

  1. 使用块将处置OdbcConnection。
  2. 正常范围规则适用于使用块内声明的任何内容。
  3. 使用块不会清除任何其他IDisposable对象。它只清理声明的项目
    • 请注意,您可以使用块进行嵌套,或者如果项目类型相同,则可以同时初始化多个项目。
  4. 请参阅How do I use the using keyword in C#的其他答案的最高位,了解更多信息。

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


    [编辑] 例如使用中的多次初始化:使用相同的初始化多个对象,而不必使用块嵌套,如果对象是相同的类型:

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

    Joel Coehoorn提到了堆叠,它是嵌套但省略了大括号,就像你可以在forif语句中省略大括号一样。 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)) 
    

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

OdbcConnection conn = new ....;
try
{
   conn.open();
   conn.....
}
finally
{
   conn.dispose();
}