2

用完一个对象后,使用指令或处置指令哪个更好?

 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() 对象来释放任何杂散锁。

有没有一致的指导?我如何判断在给定情况下对于给定对象什么更合适?

4

8 回答 8

9

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

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

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

什么是更好的?

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

于 2010-08-24T20:54:15.663 回答
6

这是同一件事。用法很简单,如果您创建对象并仅在一种方法中使用它,则使用 using。如果您需要在方法调用之后使其保持活动状态,则必须使用 Dispose()。

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

于 2010-08-24T20:55:18.830 回答
5

当您可以将对象包装在块中时Dispose(),除了在另一个实现中Dispose()(例如在您创建的实现的类中)之外,我没有理由想到手动调用。using 块将对象的创建和处置放在 try/catch/finally 块中,以保证对象将被正确处置。IDisposableusing

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

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

using 语句被翻译成三个部分:获取、使用和处置。资源的使用隐式包含在包含 finally 子句的 try 语句中。这个 finally 子句处理资源。如果获取了 null 资源,则不会调用 Dispose,也不会引发异常。

于 2010-08-24T20:58:15.250 回答
3
using(foo) 
{
    foo.DoStuff();
}

只是语法糖:

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

所以我不确定辩论从何而来。using块确实调用 dispose。大多数人using在可能的情况下更喜欢块,因为它们对正在发生的事情更加清晰和清晰。

于 2010-08-24T20:56:09.857 回答
3

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

一个using块比您记住对 Dispose 的调用要好得多,因为执行可以留下代码块的所有可能和不可能的方式。

于 2010-08-24T20:57:35.097 回答
2

在退出时使用调用 Dispose。using 更好,因为它确保调用 dispose。

于 2010-08-24T20:53:24.477 回答
2

usingDispose()当到达块的末尾时,块会自动调用。

于 2010-08-24T20:53:50.703 回答
1

有一个非常重要的原因可以在任何地方使用“using 语句”。

如果通过 using 语句包装的代码抛出异常,您可以确定“使用对象”将被释放。

于 2010-08-24T22:10:31.023 回答