在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”。