Как правильно переопределить string.GetHashCode()?

Я ищу, чтобы создать пользовательский метод string.GetHashCode() для некоторых строк, используемых в пространстве имен программы (в соответствии с рекомендациями, приведенными на странице msdn строки string.GetHashCode()). К сожалению, класс строки является запечатанным наследством.

Самым близким, что я получил, является базовый класс со строковым аксессором Value, но это будет немного раздражать тем, что код будет читать:

CustomStringTypeInstnce.Value.GetHashCode();

вместо хорошего

CustomStringTypeInstnce.GetHashCode();

это было бы возможно, если бы строковый класс не был запечатан наследством. Возможно ли вообще прочитать код, который я ищу?

если нет, то.. Мне не обязательно нужно или не нужно переопределять базовый класс string.GetHashCode() для всего пространства имен программы, но это тоже будет работать, как это будет сделано?

(РЕДАКТИРОВАТЬ) Извините, получил немного внимания, да, можно просто использовать

CustomStringTypeInstnce.GetHashCode();

как подсказывает ответ AppDeveloper, я также хотел / мог бы напрямую присвоить строку для переменной-обернутой строки, не используя аксессор, но я предполагаю, что это в значительной степени означает использование запрещенного наследования.

2 ответа

Вы не можете переопределить String.GetHashCode потому что это запечатано.

Так как единственное хорошее использование для GetHashCode использовать для "хэш" структуры данных, как Dictionary а также HashSet вместо этого вы можете использовать конструкторы, которые принимают разные IEqualityComparer,

Наиболее распространенный случай для строк покрывается классом StringComparer. Т.е. иметь словарь, который сравнивает строки в регистре без учета регистра (игнорировать культуру):

  var ages = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);

Примечание: использование GetHashCode для любых других целей (например, сохранение информации о строке вместо SHA256 или другого четко определенного хэша) не рекомендуется. Документация String.GetHashCode явно призывает к тому, что результаты могут меняться от версии к версии или даже между различными процессами / доменами приложений.

Хеш-коды для одинаковых строк могут различаться в разных версиях.NET Framework и на разных платформах (например, 32-разрядных и 64-разрядных) для одной версии.NET Framework. В некоторых случаях они могут даже отличаться в зависимости от домена приложения

я не думаю, ты можешь!

Класс String запечатан по причине, запрещающей любую такую ​​модификацию.

Вы можете сделать, выставить создать класс как

namespace ConsoleApplication2
{

    class MyClass
    {
        private string _state;
        public override int GetHashCode()
        {

            return _state.MyCustomHasCode();
        }
    }
    public static class Program
    {
        public static int MyCustomHasCode(this string str)
        {
            // return "your own hashcode implementation
        }
        static void Main(string[] args)
        {

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