在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。
另一方面,IDisposable.Dispose() 方法的语义将对象置于无法撤消的状态。
那么,为什么关于“close x dispose”甚至 MSDN 模式的几个答案都显示 Close 方法调用 Dispose ?
在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。
另一方面,IDisposable.Dispose() 方法的语义将对象置于无法撤消的状态。
那么,为什么关于“close x dispose”甚至 MSDN 模式的几个答案都显示 Close 方法调用 Dispose ?
.NET 框架本身存在很多摩擦。然而,实现始终如一,一个类的 Close() 方法总是调用它的 Dispose() 方法。
从逻辑上讲,它总是意味着完全相同的东西。您在代码中明确表示“我不再使用此对象”。所以当然 Close() 与 Dispose() 的含义完全相同。它们都意味着完全相同的东西,“我已经用完了它”。因此,这些方法的实现当然会做同样的事情。
然而,从语义上讲,它并不意味着同样的事情。大狗是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
。
这是相反的方式。通常Dispose
方法调用Close
.
如果Close
一个类的方法实现为 call Dispose
,那是因为关闭和释放是一样的。关闭后,您将无法重新打开它。