C# 处理x关闭
在总体情况下,Close方法只是在语义上更改对象的状态,而Open方法可以无限期地再次更改对象的状态 另一方面,IDisposable.Dispose()方法的语义将对象置于无法撤消的状态C# 处理x关闭,c#,idisposable,disposable,C#,Idisposable,Disposable,在总体情况下,Close方法只是在语义上更改对象的状态,而Open方法可以无限期地再次更改对象的状态 另一方面,IDisposable.Dispose()方法的语义将对象置于无法撤消的状态 那么,为什么有几个关于“closexdispose”的答案,甚至MSDN模式都显示close方法调用dispose呢?相反。通常,Dispose方法调用Close 如果类的Close方法被实现为调用Dispose,那是因为Close和disposing是相同的。一旦关闭它,就无法重新打开它。您的初始声明: 在
那么,为什么有几个关于“closexdispose”的答案,甚至MSDN模式都显示close方法调用dispose呢?相反。通常,
Dispose
方法调用Close
如果类的
Close
方法被实现为调用Dispose
,那是因为Close和disposing是相同的。一旦关闭它,就无法重新打开它。您的初始声明:
在总体情况下,Close方法只是在语义上更改对象的状态,而Open方法可以无限期地再次更改对象的状态
这是错误的。至少,就主要的.NET框架类而言,这是错误的
根据我的经验,编写obj.Close()通常不安全代码>后接obj.Open()代码>。有些类支持这样的行为,但这肯定不是一条硬性规定。我不敢打赌50%的案例都是这样
StreamReader.Close
,调用Dispose
<代码>流。关闭调用Dispose
。调用Dispose
。从SqlConnection
备注中:
Close
和Dispose
在功能上是等效的
我确信在某些情况下,Close
不会调用Dispose
,但我不建议押注于Close
后面可以跟着Open
这是.NET框架本身存在的大量摩擦。然而,实现是一致的,一个类的Close()方法总是调用它的Dispose()方法
从逻辑上讲,它总是意味着完全相同的事情。在代码中明确表示“我不再使用此对象”。因此,Close()的含义与Dispose()完全相同。它们的意思完全一样,“我已经用完了”。当然,这些方法的实现也会做同样的事情
然而,从语义上讲,它并不意味着相同的事情。大狗是使用语句
最好不要显式地调用Dispose()。代码中唯一应该出现的地方是您自己的IDisposable实现。当类中的成员自己实现IDisposable时,您需要实现它。这迫使您自己实现IDisposable,您只需通过调用成员的Dispose方法来实现它
这是你唯一使用它的地方。在任何其他用法中,都可以由方法中的using语句自动调用Dispose()。对于不希望立即处理的特殊情况,可能需要在方法调用之外保留对象。这就是使用Close()方法的时候。Close和Dispose在功能上是等效的。
--不完全相同<当using
块超出范围时,不会自动调用code>Close()
Dispose()
是。@RobertHarvey:在我引用的SqlConnection
的上下文中,它们在功能上是等价的<代码>关闭
只需调用处置
。如果Close
只是调用Dispose
,那么它们在功能上是等价的。