если тогда TKey и TValue являются типами значений, вы можете сделать словарь действительно неизменным, в том смысле, что ни его внутренняя структура, ни сами значения не могут изменяться, если эти параметры являются ключами ссылочных типов, а значения можно легко изменить, таким образом, изменяя сам словарь.Я прав?
Не совсем так.Вы выявили реальную проблему, но ваша характеристика ее не до конца продумана.
Прежде всего, я отмечаю, что да, тип значения, вставленный в неизменяемый словарь, является неизменным, даже если это изменяемое значениетип.Зачем?Потому что типы значений изменяются только путем изменения переменной, которая их содержит.Если ваш словарь не отображает переменные, которые он использует для хранения типов значений, то эти переменные не могут быть изменены.
Однако, даже если тип значения сам по себе неизменен тип неизменяемого значенияможет содержать ссылку на изменяемый тип ссылки , и теперь у нас та же проблема.Ограничение словаря типами значений только отталкивает проблему от уровня, но не решает ее!Что вам действительно нужно для гарантии «глубокой» неизменности, так это словарь типов значений blittable .Под «blittable» я подразумеваю тип значения без полей ссылочного типа.(Так называемый, потому что вы можете сериализовать один из них в хранилище, «перетаскивая» биты прямо на диск.)
К сожалению, в системе универсальных типов нет ограничений, ограничивающих blittable типы значений.
Теперь давайте рассмотрим общую проблему непостоянных ссылочных типов в неизменяемом словаре, независимо от того, существуют ли эти ссылочные типы непосредственно или через поле типа значения.Что может пойти не так, если ссылочный тип видоизменяется вне диапазона, когда он находится в неизменяемом словаре?
Ну, первое, что приходит на ум, это то, что неизменный словарь должен давать один и тот же ответ дваждыодин и тот же вопрос дважды, и теперь это уже не так.Если вы скажете «клиенты [имя]. Адрес», вы ожидаете получить один и тот же ответ дважды, но если клиент является ссылочным типом, который может изменяться, вы получите потенциально другой ответ.Это может быть или не быть желательным.(И обратите внимание, что словарь дает один и тот же ответ дважды: он дает одну и ту же ссылку на объект customer. На самом деле это объект customer, который не дает один и тот же ответ дважды.)
Если вы не пытаетесь запоминать ответы на вопросы, которые могут измениться, это, как правило, не является большой проблемой.
Большая проблема возникает, когда объект, который находится в хэш-таблице в качестве ключа, видоизменяется, изменяя тем самымего хэш-значение и «потеря» объекта в таблице.
Если это произойдет, тогда кто-то не соблюдает правила.Это следующие рекомендации: (1) ссылочные типы не должны, если возможно, основывать свои хэш-коды (и равенство) на данных, которые могут изменяться, и (2) объект, используемый в качестве ключа в хеш-таблице, не должен быть мутирован.