我应该丢弃所有一次性物品吗?

时间:2013-09-12 18:52:21

标签: c# .net idisposable

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

5 个答案:

答案 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 {}实现一次性对象。当代码块结束时,它将负责对象的放置。