6

从 HashAlgorithm 派生的对象(例如 MD5CryptoServiceProvider)具有 Dispose() 方法,但它是私有的。相反,它有一个 Clear() 方法,可以“释放所有资源”。

怎么回事?

那么这是如何正确处理 HashAlgorithm 呢?

var hasher = new MD5CryptoServiceProvider();

byte[] hashCode = hasher.ComputeHash(data);

hasher.Clear();

有人想向我解释这个吗?:)

4

3 回答 3

12

虽然该Dipose()方法是私有的,但如果您将其强制转换为IDisposable您可以访问它。但是,正如其他人所说,Clear()将为您调用它。

然而,更好的方法是将变量的声明和赋值包含在 using() 块中:

byte[] hashCode;

using(var hasher = new MD5CryptoServiceProvider())
{
    hashCode = hasher.ComputeHash(data);
}
于 2009-04-17T18:39:21.237 回答
5

用 Reflector 来看,Clear方法HashAlgorithm简单的调用了私有Dispose方法。公开带有名称的方法的原因Clear可能只是类的设计者认为它更适合散列算法的名称。您会在 BCL 的其他部分中看到类似的样式,例如Closefor System.IO.Stream。此外,这里的最佳实践是使用一个using块,它会在完成后自动调用私有Dispose方法。

于 2009-04-17T18:39:16.137 回答
-5

您应该让 GC 为您处理。这就是它的工作。

一些资源应该被处理掉,比如数据库连接和文件句柄,所以把它们放在一个using块中(C#)。不过,这不是其中一种情况。

于 2009-04-17T18:36:46.983 回答