题
如果我使用类似的东西:
using (OdbcConnection conn = new OdbcConnection(....))
{
conn.open();
my commands and sql, etc.
}
我必须做一个conn.close();还是使用语句使我无法执行最后一次通话?它是否处置了使用块中的所有内容?例如,如果我调用其他对象未与之相关,它也会自动含义这些对象吗?
谢谢你。在阅读有关Microsoft网站上使用的信息后,我不清楚。我想确保没有任何记忆泄漏。
解决方案
- 使用块将处置ODBCConnection。
- 正常范围规则适用于使用块内声明的任何内容。
- 使用块将不会清理任何其他可IDISPOSOS的对象。它只清理声明的项目
- 请注意,您可以使用块筑巢,或者如果项目是相同的类型,则可以同时初始化多个项目。
请参阅我的其他答案的顶部 如何在C#中使用使用关键字 有关更多信息。
我还应该提到,您可以在发布资源后立即关闭连接(处置)。准则说,呼叫者应该能够反复调用处置方法。使用块本质上只是安全网,在大多数情况下允许编写更清晰的代码。
编辑]例如,在A中使用以下方式:在同一对象中初始化多个对象,而无需嵌套如果对象是相同的类型:
using (Bitmap b1 = new Bitmap("file1"), b2 = new Bitmap("file2"))
{ ... }
乔尔·科霍恩(Joel Coehoorn for
, , 或者 if
陈述。 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))
其他提示
使用语句将处理呼叫关闭并为您处理方法。
斯科特·汉塞尔曼(Scott Hanselman) 对使用语句有很好的解释。
使用语句可确保将实现Idisposable的对象处置。它仅处理使用块中引用的对象,因此您的代码基本上等同于:
OdbcConnection conn = new ....;
try
{
conn.open();
conn.....
}
finally
{
conn.dispose();
}
不隶属于 StackOverflow