从HashAlgorithm派生的对象(如MD5CryptoServiceProvider )有一个Dispose()方法,但它是私有的。相反,它有一个Clear()方法,该方法“释放它使用的所有资源”。
见鬼?
那么,这是正确处理HashAlgorithm的方法吗?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();有人能给我解释一下这个吗?:)
发布于 2009-04-17 18:39:16
在使用反射器时,HashAlgorithm的Clear方法只是调用私有的Dispose方法。公开名为Clear的方法的原因可能只是因为类的设计者认为它更适合用于哈希算法。您可以在BCL的其他部分中看到类似的样式,例如用于System.IO.Stream的Close。此外,这里的最佳实践是使用using块,它将在完成时自动调用私有Dispose方法。
发布于 2009-04-17 18:39:21
虽然Dipose()方法是私有的,但如果您将其强制转换为IDisposable,则可以访问它。不过,正如其他人所说,Clear()将为您调用它。
然而,一种更好的方法是将变量的声明和赋值包含在using()块中:
byte[] hashCode;
using(var hasher = new MD5CryptoServiceProvider())
{
hashCode = hasher.ComputeHash(data);
}发布于 2009-04-17 18:36:47
你应该让GC来帮你处理。这就是工作。
一些资源应该被释放,比如DB连接和文件句柄,所以把它们放在一个using块(C#)中。不过,这不是一个这样的案例。
https://stackoverflow.com/questions/761660
复制相似问题