繁体   English   中英

我如何知道何时需要处理 object?

[英]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方法,因为它从基类继承了接口),您有两个选择:

  1. 深入研究文档以找出 class 实现IDisposable的原因,以及是否真的需要调用Dispose

  2. 只需调用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 接口。

这有几个很好的理由:

  • 您知道非托管资源(通常非常稀缺)将被清理。 通常这些都会在终结器中被清除,但由于 GC 必须使用终结器清理对象,这可能需要一段时间。
  • 如果你实现了标准的dispose 模式,你可以为 GC 节省很多工作,因为它不需要调用终结器。

我知道我需要什么时候继承 IDisposable 但我怎么知道它什么时候继承它?

假设您使用的是 Visual Studio。 我通常右键单击类型,然后“转到定义”。 如果我看到它或它的任何超类实现了 IDisposable,我确保我调用了 Dispose。 正如其他人所提到的,这通常是通过将其包装在 using 块中来完成的。

暂无
暂无

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

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