从HashAlgorithm派生的对象(如MD5CryptoServiceProvider)具有Dispose()方法,但它是私有的。相反,它有一个Clear()方法,它“释放它所使用的所有资源”。
WTF?
这是如何正确处理HashAlgorithm的吗?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
有人想向我解释这个吗? :)
答案 0 :(得分:11)
虽然Dipose()
方法是私有的,但如果将其转换为IDisposable
,则可以访问它。正如其他人所说,Clear()
会为你调用它。
然而,更好的方法是将变量的声明和赋值括在using()块中:
byte[] hashCode;
using(var hasher = new MD5CryptoServiceProvider())
{
hashCode = hasher.ComputeHash(data);
}
答案 1 :(得分:3)
使用Reflector查看Clear
HashAlgorithm
方法只需调用私有Dispose
方法。公开名为Clear
的方法的原因可能只是该类的设计者认为它将是一个更合适的哈希算法名称。您在BCL的其他部分中看到了类似的样式,例如Close
System.IO.Stream
。此外,这里的最佳做法是使用using
块,它将在完成时自动调用私有Dispose
方法。
答案 2 :(得分:-5)
您应该让GC为您处理。这是它的工作。
应该处理某些资源,例如数据库连接和文件句柄,因此将它们放在using
块(C#)中。但这不是其中之一。