Вопрос

Объекты, производные от 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 блок (С#).Хотя это не один из тех случаев.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top