Что делает CLR с неизменяемыми структурами? - PullRequest
2 голосов
/ 08 августа 2010

Я читал немного о неизменных структурах , таких как строка.Проще говоря, они не меняют состояние после того, как они были созданы (например, запрос подстроки дает вам новую строку).

Теперь мне было интересно, знает ли CLR, что определеннаяtype является неизменным и использует этот факт для выполнения чего-то умного во время выполнения, или же неизменность - это в основном то, что упрощает программирование определенных сценариев?

Ответы [ 4 ]

5 голосов
/ 08 августа 2010

Обычно CLR не делает ничего особенного с неизменяемыми типами. Они обрабатываются так же, как и любые другие типы.

Для строк есть специальная поддержка. Строки могут быть интернированы и использованы повторно. В C # строковые литералы исходного кода автоматически интернируются компилятором. Вы также можете интернировать строку самостоятельно, позвонив String.Intern.

2 голосов
/ 08 августа 2010

Потенциально, возможно, что компилятор (а не CLR) может сделать что-то умное в создании IL.Я не знаю, так ли это, и, честно говоря, все равно: если нет, возможно, так и будет в будущем (более поздние версии).Если это произойдет, может быть, этого не произойдет в будущем (найден крайний случай, показывающий, что оптимизация опрометчива.

Я рад думать, что «хорошо, если это только для чтения, то, возможно,компилятор (или, действительно, CLR) сделает с ним что-то умное, так что это будет бесплатное улучшение ». Это будет бесплатное улучшение, потому что я никогда не собираюсь делать что-то для чтения только для чтенияПреимущество такой оптимизации, даже если я узнаю, что она определенно делает это и что такая экономия велика. Я буду когда-либо делать что-то только для чтения, если это будет иметь смысл для чтения. Я делаю это много, потому что мой стиль поддерживает интенсивное использование неизменяемых объектовно я сделаю это только потому, что объект является логически неизменным, вместо того чтобы сделать его неизменным для достижения некоторой оптимизации, а затем придется обойти неизменность.

Конечно, есть и определенные способы, которыми вы может быть умным с неизменными объектами (в частности, при разработке эффектов различных многопоточных сценариевбудет иметь на вашем коде).

0 голосов
/ 24 сентября 2011

Ни компилятор, ни .net не делают ничего с неизменяемыми структурами, что не делает с изменяемыми структурами, хотя он делает некоторые вещи со структурами, которые семантически допустимы, только если они оказываются неизменяемыми.Например, если структура приведена к Object, компилятор создаст новый упакованный экземпляр структуры, инициализированный теми же данными, что и оригинал.Если структура изменчива, новый экземпляр не будет семантически таким же, как исходный, поскольку изменения одного экземпляра не будут влиять на другой.Существуют и другие обстоятельства, когда компиляторы копируют структуры и делают вид, что копии семантически взаимозаменяемы с оригиналами;к сожалению, я не знаю способа запросить, чтобы ситуации, которые вызывали бы такие неявные копии, приводили к ошибке времени компиляции, а не к тому, чтобы копии происходили.

0 голосов
/ 08 августа 2010

В перспективе CLR значение MUTABLE. Например: CLR может изменить данные объекта для выполнения кэширования. Пользователи структуры не могут изменить его значение, но CLR может сделать это в нескольких сценариях. Вот почему CLR не может принудительно установить неизменность и не может ретранслировать его во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...