我如何知道何时需要处理某些东西?有人提到我在代码中有几个需要处理的对象。我不知道我需要处理任何东西(这是我用C#的第一周)。我怎么知道什么时候需要处理一个物体?我正在使用http://msdn.microsoft.com/en-us/library/system.security.cryptography.hashalgorithm.aspx,我没有看到任何提及页面上的处理或看到它提到任何其他objs我被告知我要处置(由某人在SO)。
我知道我需要在什么时候继承IDisposable,但是我知道它何时继承它?
答案 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
方法,因为它从基类继承了接口),您有两个选择:
深入了解文档,找出该类实现IDisposable
的原因,以及是否真的需要调用Dispose
。
只需致电Dispose
。
这两种方法都是安全的。如果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接口。
有几个很好的理由:
答案 6 :(得分:0)
我知道我需要什么时候 继承IDisposable,但我怎么知道 什么时候继承呢?
假设您使用的是Visual Studio。我通常右键单击类型,然后“转到定义”。如果我看到它或它的任何超级类,实现IDisposable,我确保我在它上面调用Dispose。这通常是通过将其包装在其他人提到的使用块中来完成的。
答案 7 :(得分:0)
“最后一个人离开房间请关灯吗?”
实现IDisposable的对象保存了执行“清理”操作所需的信息和动力,这些操作应该“在某个时间”发生,但在对象仍在使用时不会发生。如果对象完全被放弃,那么这些清理操作就不会发生。该系统包括一个保管人,物品在创建时可以登记;如果一个物体被除了保管人以外的绝对所有人抛弃,保管人可以要求物品在保管人放弃之前执行其清理行动。请注意,出于各种原因,托管人在处理废弃物体方面并非100%有效。因此,非常希望在放弃引用之前,最后一个持有对象有用引用的实体处理它。