Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理x关闭_C#_Idisposable_Disposable - Fatal编程技术网

C# 处理x关闭

C# 处理x关闭,c#,idisposable,disposable,C#,Idisposable,Disposable,在总体情况下,Close方法只是在语义上更改对象的状态,而Open方法可以无限期地再次更改对象的状态 另一方面,IDisposable.Dispose()方法的语义将对象置于无法撤消的状态 那么,为什么有几个关于“closexdispose”的答案,甚至MSDN模式都显示close方法调用dispose呢?相反。通常,Dispose方法调用Close 如果类的Close方法被实现为调用Dispose,那是因为Close和disposing是相同的。一旦关闭它,就无法重新打开它。您的初始声明: 在

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

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


那么,为什么有几个关于“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
,那么它们在功能上是等价的。