在整体情况下,Close方法在语义上只是无限期地改变了可以使用Open方法再次更改的对象的状态。
另一方面,IDisposable.Dispose()方法的语义将对象置于无法撤消的状态。
那么,为什么有几个关于“close x dispose”甚至MSDN模式的答案显示Close方法调用Dispose?
答案 0 :(得分:4)
这与.NET框架本身存在很多摩擦。然而,实施始终毫不奇怪,一个班级' Close()方法总是调用它的Dispose()方法。
从逻辑上讲,它总是意味着完全相同的事情。你明确地说'#34;我不再使用这个对象"在你的代码中。所以当然,Close()意味着与Dispose()完全相同。它们都意味着完全相同的事情,"我已经完成了使用它"。当然,这些方法的实现完全相同。
从语义上讲,不意味着同样的事情。最重要的是使用语句。
您最好永远显式调用Dispose()。唯一的地方是永远出现在您的代码中是在您自己的IDisposable实现中。当您的类具有自己实现IDisposable的成员时,您需要实现哪些。这迫使你自己实施IDisposable,你只需通过调用成员来实现它。处理方法。
这是你唯一使用它的地方。在任何其他用法中,您可以将其留在方法内的 using 语句中,以自动为您调用Dispose()。如果您不想立即处置,那么您可能需要将对象保留在方法调用之外。当您使用Close()方法时。
答案 1 :(得分:2)
您的初步陈述:
在整体情况下,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
的想法}。
答案 2 :(得分:0)
反过来说。通常Dispose
方法会调用Close
。
如果实现了类的Close
方法来调用Dispose
,那么它的关闭和处理是相同的。关闭后,您无法重新打开它。