【发布时间】:2014-04-02 21:58:23
【问题描述】:
在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。
另一方面,IDisposable.Dispose() 方法的语义将对象置于无法撤消的状态。
那么,为什么有几个关于“close x dispose”的答案,甚至 MSDN 模式都显示 Close 方法调用 Dispose ?
【问题讨论】:
标签: c# idisposable disposable
在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。
另一方面,IDisposable.Dispose() 方法的语义将对象置于无法撤消的状态。
那么,为什么有几个关于“close x dispose”的答案,甚至 MSDN 模式都显示 Close 方法调用 Dispose ?
【问题讨论】:
标签: c# idisposable disposable
.NET 框架本身存在很多摩擦。然而,实现始终如一,一个类的 Close() 方法总是调用它的 Dispose() 方法。
从逻辑上讲,它总是意味着完全相同的东西。您在代码中明确表示“我不再使用此对象”。所以当然 Close() 与 Dispose() 的含义完全相同。它们都意味着完全相同的东西,“我已经用完了它”。所以当然这些方法的实现是做同样的事情。
然而在语义上它确实 not 意味着同样的事情。大狗是 using 语句。
您最好从不显式调用 Dispose()。唯一应该曾经出现在您的代码中的是您自己的 IDisposable 实现。当您的类有自己实现 IDisposable 的成员时,您需要实现它。这要求您自己实现 IDisposable,您只需通过调用成员的 Dispose 方法来实现它。
这是您唯一使用过它的地方。在任何其他用法中,您将其留给方法内部的 using 语句来自动为您调用 Dispose()。对于您不想立即处理的极端情况,您可能需要将对象保留在方法调用之外。那是你使用 Close() 方法的时候。
【讨论】:
您的初始陈述:
在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。
是假的。至少,就主要的 .NET Framework 类而言,它是错误的。
根据我的经验,写obj.Close(); 后跟obj.Open(); 通常并不安全。 一些 类支持这种行为,但这当然不是硬性规定。我不敢打赌这在 50% 的情况下是正确的。
StreamReader.Close,呼叫Dispose。 Stream.Close 致电 Dispose。 SqlConnection.Close 致电 Dispose。来自SqlConnection 备注:
Close和Dispose在功能上是等效的。
我确信在某些情况下Close 不会调用Dispose,但我不建议押注Close 可以跟随Open。
【讨论】:
Close and Dispose are functionally equivalent. -- 不完全是。当using 块超出范围时,Close() 不会自动调用; Dispose() 是。
SqlConnection 的上下文中,它们在功能上是等效的。 Close 只需调用 Dispose。如果Close 只是对Dispose 的调用,那么它们在功能上是等效的。
情况正好相反。通常Dispose方法调用Close。
如果一个类的Close方法实现调用Dispose,那是因为关闭和释放是一样的。一旦你关闭它,你就不能重新打开它。
【讨论】: