4

我怎么知道什么时候需要处理一些东西?有人刚刚提到我的代码中有几个需要处理的对象。我不知道我需要处理任何东西(这是我使用 C# 的第一周)。我怎么知道什么时候需要处理一个对象?我正在使用http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx,我没有看到页面上提到 dispose 或看到我在任何其他 objs 中提到它告诉我处置(由某人在SO上)。

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

4

8 回答 8

4

您应该处置任何实现 IDisposable 的东西。只需将其包装在 using 上:

   using(var some = new Something())
   {
    //use normally
   }
于 2009-03-08T07:36:23.850 回答
3

一种简单的方法是输入 obj.disp 并查看智能感知是否具有 dispose 方法。

于 2009-03-09T03:03:05.980 回答
2

该类实现了接口IDisposable,这意味着它有一个Dispose方法。

并非每个实现 IDisposable 的类都需要您调用Dispose,但大多数都需要。如果你看到这个类实现了IDisposable(或者有一个Dispose方法,因为它从基类继承了接口),你有两个选择:

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

  2. 只要打电话Dispose

任何一种方法都是安全的。如果该Dispose方法不执行任何操作,则调用将非常快。您甚至可以Dispose多次调用而不会受到伤害。

比仅仅调用方法更好的Dispose是使用using块:

using (FileStream s = File.OpenRead(path)) {
   ...
}

在块的末尾括号,该Dispose方法被自动调用。该using块被实现为 a try...finally,因此Dispose即使该块中发生异常,也可以保证调用该方法。

于 2009-03-08T07:41:39.847 回答
0

如果一个类实现了 IDisposable 你应该处置该类的实例。如果没有,你就没有。在这种情况下,HashAlgorithm 派生自 ICryptoTransform,而 ICryptoTransform 派生自 IDisposable。这意味着必须释放所有从 HashAlgorithm 派生的类实例。

于 2009-03-08T07:37:05.300 回答
0

您应该处置任何实现 IDisposable 接口的对象。

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable

任何具有非托管资源(例如数据库连接)的东西都应该实现 IDisposable 接口。

这有几个很好的理由:

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

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

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

于 2009-03-08T09:33:50.433 回答
0

“请最后一个离开房间的人把灯关掉好吗?”

实现 IDisposable 的对象拥有执行一些“清理”操作所需的信息和动力,这些操作应该“有时”发生,但在对象仍在使用时不会发生。如果对象完全被遗弃,那些清理操作将不会发生。该系统包括一个保管人,对象可以在创建时注册;如果一个对象被除了保管人之外的所有人遗弃,保管人可以要求该对象在保管人也放弃它之前执行其清理操作。请注意,由于各种原因,保管人在处理废弃物品方面并非 100% 有效。因此,非常希望,只要有可能,最后一个持有对对象的有用引用的实体在放弃引用之前将其处理掉。

于 2011-02-15T16:51:23.390 回答