繁体   English   中英

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

[英]Should I dispose all disposable objects?

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

是的,除非您从一个需要它的呼叫者那里收到它,或者你已经负责调用Dispose() 重要的是有人调用Dispose() ,如果你正在传递一个IDisposable实例,那么需要有一个关于你是否为它获取所有权的理解(“合同”)(因此需要处理它)或者你是否是“借用它”,来电者将在您返回时使用/处理它。 这些是良好的 API在其文档中具有的类型。

如果你实例化对象,可以很容易对自己通过使用自动配置using

确保在丢失范围之前处置项目

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

您可能会看到: CA2000:在丢失范围之前处置对象

如果在对所有对象的所有引用都超出范围之前没有明确地处置一次性对象,则当垃圾收集器运行对象的终结器时,该对象将在某个不确定的时间处置。 由于可能会发生异常事件以阻止对象的终结器运行,因此应该明确地处理该对象。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM