.NET中的许多对象(例如SQLCommand
)实现IDisposable
。作为一般规则,如果我创建一个IDisposable
对象的实例,我应该一直处理它吗?
答案 0 :(得分:17)
是的,除非您在完成任务或负责致电Dispose()
后从需要它的来电者那里收到。重要的是某人调用Dispose()
,如果您正在通过IDisposable
实例,则需要了解(“合同”)是否要取得所有权因为它(因此需要处理它)或者你是否“借用它”而且呼叫者将在你返回时使用/处置它。这些是 good API在其文档中具有的类型。
如果要实例化对象,请使用using
自行处理。
答案 1 :(得分:4)
确保在丢失范围之前处置项目。
最好的方法是使用using
语句,或者您可以手动调用Dispose
,但在它失去范围并有资格进行垃圾回收之前。
您可能会看到:CA2000: Dispose objects before losing scope
如果一次性物品没有明确处理 对它的引用超出了范围,该对象将被置于某些位置 垃圾收集器运行终结器时的不确定时间 物体。因为可能会发生可能阻止的异常事件 从运行的对象的终结器,对象应该是 明确地代替了。
答案 2 :(得分:1)
作为一般规则,是的。最简单的方法是使用using
statement。
答案 3 :(得分:1)
几乎总是肯定的,但是这里有一个例子,当处理某些东西借用会导致问题。我创建了一个带有两个构造函数的一次性存储库,一个用于获取DbContext,另一个用于创建DbContext本身的默认构造函数。当我的存储库被丢弃时,我遇到了实例,触发了DbContext的处理(因为我告诉它),这有时会导致问题,因为我仍然需要在代码中其他地方传递的DbContext。
在这种情况下,存储库创建DbContext并且必须对它负责并处理它,因为没有其他代码可以,但是当DbContext被其他代码传入时,处理DbContext应该是创建它的代码。
答案 4 :(得分:0)
在所有情况下都不是强制性的,但是处理对象是一种很好的做法。如果您不想为每个对象执行此操作,请使用using {}
实现一次性对象。当代码块结束时,它将负责对象的放置。