[英]How do i know when i need to dispose an object?
我怎么知道什么时候需要处理一些东西? 有人刚刚提到我的代码中有几个需要处理的对象。 我不知道我需要处理任何东西(这是我使用 C# 的第一周)。 我如何知道何时需要处理 object? 我正在使用http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx并且我没有在页面上看到任何提及 dispose 或在我的任何其他对象中看到它告诉我处置(由某人在SO上)。
我知道我需要什么时候继承 IDisposable 但我怎么知道它什么时候继承它?
您应该处置任何实现 IDisposable 的东西。 只需将其包装在 using 上:
using(var some = new Something())
{
//use normally
}
一种简单的方法是输入 obj.disp 并查看智能感知是否具有 dispose 方法。
class 实现了接口IDisposable
,这意味着它有一个Dispose
方法。
并非每个实现 IDisposable 的 class 都需要您调用Dispose
,但大多数都需要。 如果您看到 class 实现了IDisposable
(或具有Dispose
方法,因为它从基类继承了接口),您有两个选择:
深入研究文档以找出 class 实现IDisposable
的原因,以及是否真的需要调用Dispose
。
只需调用Dispose
。
任何一种方法都是安全的。 如果Dispose
方法不执行任何操作,则调用将非常快。 您甚至可以多次调用Dispose
而不会造成伤害。
比只调用Dispose
方法更好的是使用using
块:
using (FileStream s = File.OpenRead(path)) {
...
}
在块的末尾括号处,会自动调用Dispose
方法。 using
块实现为try...finally
,因此即使块中发生异常,也保证调用Dispose
方法。
“请最后一个离开房间的人把灯关掉好吗?”
实现 IDisposable 的 object 拥有执行某些“有时”应该发生的“清理”操作所需的信息和动力,但在 object 仍在使用时无法发生。 如果 object 完全放弃,这些清理操作将不会发生。 该系统包括一个保管人,对象可以在创建时注册; 如果 object 被除托管人之外的所有人抛弃,托管人可以要求 object 在托管人放弃之前执行其清理操作。 请注意,由于各种原因,保管人在处理废弃物品方面并非 100% 有效。 因此,非常希望,只要有可能,最后一个持有对 object 的有用引用的实体在放弃引用之前将其处理掉。
如果 class 实现了 IDisposable,您应该处理该 class 的实例。 如果没有,你就没有。 在这种情况下,HashAlgorithm 派生自 ICryptoTransform,而 ICryptoTransform 派生自 IDisposable。 这意味着必须释放所有从 HashAlgorithm 派生的类实例。
您应该处理任何实现 IDisposable 接口的 object。
public abstract class HashAlgorithm : ICryptoTransform,
IDisposable
任何具有非托管资源(例如数据库连接)的东西都应该实现 IDisposable 接口。
这有几个很好的理由:
我知道我需要什么时候继承 IDisposable 但我怎么知道它什么时候继承它?
假设您使用的是 Visual Studio。 我通常右键单击类型,然后“转到定义”。 如果我看到它或它的任何超类实现了 IDisposable,我确保我调用了 Dispose。 正如其他人所提到的,这通常是通过将其包装在 using 块中来完成的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.