Во-первых, неизвестно, улучшится ли кэширование этого результата Dictionary<string, ...>
и др., Потому что они не обязательно используют String.GetHashCode, потому что он использует IComparer для получения хеш-кода для строки.
И если вы следуете вероятной цепочке вызовов для класса StringComparer, он в конечном итоге переходит к классу System.Globalization.CompareInfo, который в итоге завершается этим методом:
[SecurityCritical, SuppressUnmanagedCodeSecurity, DllImport("QCall",
CharSet=CharSet.Unicode)]
private static extern int InternalGetGlobalizedHashCode(IntPtr handle, string
localeName, string source, int length, int dwFlags);
Нет сведений о том, не использует ли эта библиотека (которая выглядит как собственный метод) какую-либо форму внутреннего кэширования на основе базовой структуры данных объекта .Net, которую мы не можем получить сразу во время выполнения .Net.
Однако при этом важно отметить, что одна строка может иметь много разных хеш-кодов в зависимости от того, как вы решили интерпретировать символы. Конечно, эта реализация не зависит от культуры, поэтому она не подходит для этих компараторов.
Итак, хотя дополнительная память может быть фактором, я на самом деле думаю, что это потому, что хранение хеш-кода вместе с экземпляром строки вводит в заблуждение вызывающую сторону, и, действительно, внутреннюю команду разработчиков .Net (!), думая, что строка имеет только один хеш-код, хотя на самом деле это полностью зависит от того, как вы собираетесь ее интерпретировать - как последовательность байтов (что большинство из нас не делает), или как последовательность печатные символы.
С точки зрения производительности, тогда, если мы также примем, что эти компараторы, используемые Dictionary<,>
и т. Д., Не могут использовать внутреннюю реализацию, не кэширование этого результата, вероятно, не окажет большого влияния, потому что, честно говоря как часто этот метод будет вызываться в реальном мире: поскольку в большинстве случаев хеш-код строки вычисляется с помощью какого-либо другого механизма.
EDIT
В ответе Тима также есть пункт (+1 там). Если он прав, и я думаю, что он прав, то нет никакой гарантии, что строка действительно неизменна после построения, поэтому кешировать результат будет неправильно.
ДОПОЛНИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ (!)
Дэн подчеркивает, что строки должны быть неизменяемыми в сфере Net, и поэтому эта строка должна свободно кэшировать свой собственный хеш-код на основе этого. Проблема здесь заключается в том, что .Net Framework также предоставляет законный способ изменить предположительно неизменную строку , которая не требует привилегированного отражения или чего-либо еще. Это фундаментальная проблема со строками, это указатель на буфер, который вы не можете контролировать. Не берите в голову мир C #, а как насчет C ++, где векторизация и модификация буферов памяти - обычное дело. То, что вы в идеале не должны делать это, не означает, что фреймворк должен ожидать, что вы этого не сделаете.
.Net, оказывается, предоставляют эту функциональность, и, следовательно, если это было решение по проекту команды .Net в ответ на вид бинарного бандитизма, предложенный Тимом, то они были очень мудры, чтобы принять это во внимание. Будь они сделали, или это по счастливой случайности, это совсем другое дело! :)