.NET:处理HashAlgorithm对象

cor*_*ore 5 .net hashalgorithm

从HashAlgorithm派生的对象(如MD5CryptoServiceProvider)具有Dispose()方法,但它是私有的.相反,它有一个Clear()方法,它"释放它所使用的所有资源".

WTF?

这是如何正确处理HashAlgorithm的呢?

var hasher = new MD5CryptoServiceProvider();

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

hasher.Clear();
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*son 11

虽然该Dipose()方法是私有的,但如果您将其投射到IDisposable您可以获得访问权限.正如其他人所说的那样,Clear()会为你打电话.

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

byte[] hashCode;

using(var hasher = new MD5CryptoServiceProvider())
{
    hashCode = hasher.ComputeHash(data);
}
Run Code Online (Sandbox Code Playgroud)


Nol*_*rin 5

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