6

.NET 中的许多对象(SQLCommand例如)实现IDisposable. 作为一般规则,如果我创建一个IDisposable对象的实例,我应该总是处置它吗?

4

5 回答 5

17

是的,除非您是从需要它的呼叫者那里收到的,一旦您完成或已负责呼叫Dispose()。重要的是有人打电话给Dispose()你,如果你被传递给一个IDisposable实例,你需要了解(“合同”)你是否拥有它的所有权(因此需要处置它)或者你是否“借用它” "并且来电者将在您返回时使用/处理它。这些是优秀API 在其文档中的内容类型。

如果您正在实例化对象,请让您自己轻松地使用using.

于 2013-09-12T18:52:47.003 回答
4

确保在它们失去作用域之前处置这些物品

最好的方法是使用using语句,或者您可以手动调用Dispose,但在它失去范围并有资格进行垃圾收集之前。

您可能会看到:CA2000:在失去作用域之前处理对象

如果一次性对象在对它的所有引用超出范围之前没有显式释放,那么当垃圾收集器运行对象的终结器时,该对象将在某个不确定的时间被释放。因为可能会发生异常事件,阻止对象的终结器运行,所以应该显式地释放对象。

于 2013-09-12T18:55:42.453 回答
1

作为一般规则,是的。最简单的方法通常是使用using语句

于 2013-09-12T18:53:10.773 回答
1

几乎总是是的,但这里有一个例子,说明什么时候处理借来的东西可能会导致问题。我创建了一个带有两个构造函数的一次性存储库,一个接受 DbContext,另一个默认构造函数创建 DbContext 本身。我遇到了一些实例,当我的存储库将被处置时,触发了 DbContext 的处置(因为我告诉过它),这有时会导致问题,因为我仍然需要在代码中其他地方传递的 DbContext。

在这种情况下,存储库创建 DbContext 并且必须对它负责并处理它,因为没有其他代码可以,但是当 DbContext 由其他代码传入时,处理 DbContext 应该是创建代码的责任它。

于 2013-09-12T18:57:42.673 回答
0

并非在所有情况下都是强制性的,但处置对象是一种很好的做法。如果您不想为每个对象执行此操作,请使用using {}实现一次性的对象。当代码块结束时,它将负责处理对象。

于 2013-09-12T18:55:20.890 回答