处理x关闭

时间:2014-04-02 21:58:23

标签: c# idisposable disposable

在整体情况下,Close方法在语义上只是无限期地改变了可以使用Open方法再次更改的对象的状态。

另一方面,IDisposable.Dispose()方法的语义将对象置于无法撤消的状态。

那么,为什么有几个关于“close x dispose”甚至MSDN模式的答案显示Close方法调用Dispose?

3 个答案:

答案 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,来电DisposeStream.Close来电DisposeSqlConnection.Close来电Dispose。来自SqlConnection备注:

  

CloseDispose功能相同。

我确信有些Close没有调用Dispose的情况,但我不建议押注Close可以跟Open的想法}。

答案 2 :(得分:0)

反过来说。通常Dispose方法会调用Close

如果实现了类的Close方法来调用Dispose,那么它的关闭和处理是相同的。关闭后,您无法重新打开它。