.NET: удаление объекта HashAlgorithm - PullRequest
5 голосов
/ 17 апреля 2009

Объекты, производные от HashAlgorithm, такие как MD5CryptoServiceProvider, имеют метод Dispose (), но он является закрытым. Вместо этого он имеет метод Clear (), который «освобождает все ресурсы», используемые им.

WTF?

Это как правильно утилизировать HashAlgorithm?

var hasher = new MD5CryptoServiceProvider();

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

hasher.Clear();

Кто-то хочет объяснить это мне? :)

Ответы [ 3 ]

11 голосов
/ 17 апреля 2009

Пока метод Dipose() является закрытым, если вы приведете его к IDisposable, вы сможете получить к нему доступ. Однако, как говорили другие, Clear() назовет это для вас.

Однако лучший подход заключается в том, чтобы заключить объявление и присваивание переменной в блоке using ():

byte[] hashCode;

using(var hasher = new MD5CryptoServiceProvider())
{
    hashCode = hasher.ComputeHash(data);
}
3 голосов
/ 17 апреля 2009

При использовании Reflector метод Clear для HashAlgorithm просто вызывает приватный метод Dispose. Причиной предоставления метода с именем Clear, вероятно, было то, что разработчики класса решили, что это будет более подходящее имя для алгоритма хеширования. Вы видите подобные стили в других частях BCL, таких как Close для System.IO.Stream. Кроме того, в данном случае рекомендуется использовать блок using, который автоматически вызовет закрытый метод Dispose после его завершения.

0 голосов
/ 17 апреля 2009

Вы должны позволить GC справиться с этим за вас. Это его работа.

Необходимо утилизировать некоторые ресурсы, такие как подключения к БД и файловые дескрипторы, поэтому поместите их в блок using (C #). Это не один из тех случаев.

...