2

在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。

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

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

4

3 回答 3

4

.NET 框架本身存在很多摩擦。然而,实现始终如一,一个类的 Close() 方法总是调用它的 Dispose() 方法。

从逻辑上讲,它总是意味着完全相同的东西。您在代码中明确表示“我不再使用此对象”。所以当然 Close() 与 Dispose() 的含义完全相同。它们都意味着完全相同的东西,“我已经用完了它”。因此,这些方法的实现当然会做同样的事情。

然而,从语义上讲,它并不意味着同样的事情。大狗是using语句。

您最好不要显式调用 Dispose() 。唯一应该出现在您的代码中的地方是您自己的 IDisposable 实现。当您的类有自己实现 IDisposable 的成员时,您需要实现它。这迫使您自己实现 IDisposable,您只需通过调用成员的 Dispose 方法来实现它。

这是您唯一使用它的地方。在任何其他用法中,您将其留给方法内部的using语句来自动为您调用 Dispose()。对于您不想立即处理的极端情况您可能需要将对象保留在方法调用之外。那是您使用 Close() 方法的时候。

于 2014-04-02T23:49:43.490 回答
2

您的初始声明:

在总体情况下,Close 方法在语义上只是更改对象的状态,而该对象的状态可以通过 Open 方法无限期地再次更改。

是假的。至少,就主要的 .NET Framework 类而言,它是错误的。

根据我的经验,写obj.Close();后跟obj.Open();. 一些类支持这种行为,但这当然不是一个硬性规定。我不敢打赌这在 50% 的情况下是正确的。

StreamReader.Close, 呼叫Dispose. Stream.Close来电DisposeSqlConnection.Close调用Dispose。从SqlConnection评论中:

Close并且Dispose在功能上是等效的。

我确信在某些情况下Close不会跟Dispose注,但我不建议押注Close可以遵循的想法Open

于 2014-04-02T22:07:48.820 回答
0

这是相反的方式。通常Dispose方法调用Close.

如果Close一个类的方法实现为 call Dispose,那是因为关闭和释放是一样的。关闭后,您将无法重新打开它。

于 2014-04-02T22:07:06.710 回答