.СЕТЬ:Удаление объекта HashAlgorithm
-
11-09-2019 - |
Вопрос
Объекты, производные от HashAlgorithm, такие как MD5CryptoServiceProvider, имеют метод Dispose(), но он является закрытым.Вместо этого у него есть метод Clear(), который «освобождает все используемые им ресурсы».
Что за черт?
Тогда как правильно избавиться от HashAlgorithm?
var hasher = new MD5CryptoServiceProvider();
byte[] hashCode = hasher.ComputeHash(data);
hasher.Clear();
Кто-нибудь хочет объяснить мне это?:)
Решение
Глядя с помощью рефлектора, 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
блок (С#).Хотя это не один из тех случаев.