.NET 中的许多对象(SQLCommand
例如)实现IDisposable
. 作为一般规则,如果我创建一个IDisposable
对象的实例,我应该总是处置它吗?
5 回答
是的,除非您是从需要它的呼叫者那里收到的,一旦您完成或已负责呼叫Dispose()
。重要的是有人打电话给Dispose()
你,如果你被传递给一个IDisposable
实例,你需要了解(“合同”)你是否拥有它的所有权(因此需要处置它)或者你是否“借用它” "并且来电者将在您返回时使用/处理它。这些是优秀API 在其文档中的内容类型。
如果您正在实例化对象,请让您自己轻松地使用using
.
确保在它们失去作用域之前处置这些物品。
最好的方法是使用using
语句,或者您可以手动调用Dispose
,但在它失去范围并有资格进行垃圾收集之前。
您可能会看到:CA2000:在失去作用域之前处理对象
如果一次性对象在对它的所有引用超出范围之前没有显式释放,那么当垃圾收集器运行对象的终结器时,该对象将在某个不确定的时间被释放。因为可能会发生异常事件,阻止对象的终结器运行,所以应该显式地释放对象。
作为一般规则,是的。最简单的方法通常是使用using
语句。
几乎总是是的,但这里有一个例子,说明什么时候处理借来的东西可能会导致问题。我创建了一个带有两个构造函数的一次性存储库,一个接受 DbContext,另一个默认构造函数创建 DbContext 本身。我遇到了一些实例,当我的存储库将被处置时,触发了 DbContext 的处置(因为我告诉过它),这有时会导致问题,因为我仍然需要在代码中其他地方传递的 DbContext。
在这种情况下,存储库创建 DbContext 并且必须对它负责并处理它,因为没有其他代码可以,但是当 DbContext 由其他代码传入时,处理 DbContext 应该是创建代码的责任它。
并非在所有情况下都是强制性的,但处置对象是一种很好的做法。如果您不想为每个对象执行此操作,请使用using {}
实现一次性的对象。当代码块结束时,它将负责处理对象。