.NET: удаление объекта HashAlgorithm

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

WTF?

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

var hasher = new MD5CryptoServiceProvider();

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

hasher.Clear();

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

3 ответа

Решение

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

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

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

byte[] hashCode;

using(var hasher = new MD5CryptoServiceProvider())
{
    hashCode = hasher.ComputeHash(data);
}

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

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

Другие вопросы по тегам