我怎么知道什么时候需要处理一个物体?

时间:2009-03-08 07:30:10

标签: c# dispose

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

我知道我需要在什么时候继承IDisposable,但是我知道它何时继承它?

8 个答案:

答案 0 :(得分:10)

答案 1 :(得分:4)

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

   using(var some = new Something())
   {
    //use normally
   }

答案 2 :(得分:3)

一种简单的方法是输入obj.disp并查看intellisense是否有一个dispose方法。

答案 3 :(得分:2)

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

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

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

  2. 只需致电Dispose

  3. 这两种方法都是安全的。如果Dispose方法没有执行任何操作,则呼叫将非常快。您甚至可以多次致电Dispose而不会受到伤害。

    更好的是,只需调用Dispose方法即可使用using块:

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

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

答案 4 :(得分:0)

如果一个类实现了IDisposable,你应该处理该类的intances。如果不是你没有。在这种情况下,HashAlgorithm派生自ICryptoTransform,它派生自IDisposable。这意味着必须处理从HashAlgorithm下降的所有类实例。

答案 5 :(得分:0)

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

public abstract class HashAlgorithm : ICryptoTransform, 
IDisposable

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

有几个很好的理由:

  • 您知道将清理非托管资源(通常非常稀缺)。通常这些将在终结器中清除,但由于GC必须用终结器整理对象,这可能需要一段时间。
  • 如果您实施标准dispose pattern,则需要为GC保存很多工作,因为它不需要调用终结器。

答案 6 :(得分:0)

  

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

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

答案 7 :(得分:0)

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

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