在C#或方法中使用语句会更好吗? 这适用于外部(COM)对象吗?

什么是更好的,using指令,或者在完成对象时使用dispose指令?

using(FileStream fileStream = new FileStream( "logs/myapp.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { using(StreamReader streamReader = new StreamReader(fileStream)) { this.textBoxLogs.Text = streamReader.ReadToEnd(); } } 

另一方面,当我正在处理System.Net.Mail时,我被告知我需要对象的Dispose()来释放任何杂散锁。

有没有一致的指导? 在给定对象的给定情况下,如何判断哪些更合适?

除了在Dispose()另一个实现中(例如在你创建的实现IDisposable ),当我可以将对象包装在using块中时,我没有理由手动调用Dispose() 。 using块将对象的创建和处理放在try / catch / finally块中,以便对象将被正确处理掉。

编译器比我更可靠。 或者您。 =)

MSDN记录using语句并调出可以获取C#语言规范的位置,您可以在其中查看第8.13节“使用语句”(至少在v4.0参考中它是8.13),它给出了using语句的全面解释以及如何使用它。 第五段给出以下内容:

使用声明分为三个部分:获取,使用和处置。 资源的使用隐式包含在包含finally子句的try语句中。 这个finally子句处理资源。 如果获取了空资源,则不会调用Dispose,也不会抛出exception。

using 语句 (非指令)涉及在finally块中对Dispose()的隐式调用。 所以这里没有矛盾。 你能链接到那个讨论吗?

官方的定义
using (x) { ... }

try ... finally if (x != null) x.Dispose(); }

什么是更好的?

从符号的角度来看, using() { }块。 从技术上讲,它们是一样的。

这是同一件事。 用法很简单,如果您创建对象并仅在一个方法中使用它,则使用using。 如果你需要在方法调用之外保持活着,那么你必须使用Dispose()。

COM对象的运行时可调用包装器没有Dispose()方法。

使用调用退出时处理。 使用更好是因为它确保了呼叫处理。

当到达块的末尾时, using块自动调用Dispose()

 using(foo) { foo.DoStuff(); } 

这只是语法糖:

 try { foo.DoStuff(); } finally { if(foo != null) foo.Dispose(); } 

所以我不确定辩论的来源。 using块确实调用dispose。 大多数人喜欢尽可能using积木,因为它们更清洁,更清晰。

只要对象的生命周期在代码块内,如果您的对象需要长时间using ,请使用using ,例如在异步调用之后处理,您需要手动调用Dispose

using块比以任何可能和不可能的方式记住对Dispose的调用更好,执行可以留下一段代码。

在任何地方使用“使用声明”都有一个非常重要的原因。

如果通过using语句包装的代码引发exception,则可以确定将使用“using object”。