Чтобы любой компилятор мог это сделать, у него должен быть какой-то способ иметь гарантии для следующих проблем:
- Построение двух объектов одним и тем же способом дает идентичные объекты любым способом, за исключением их расположения в памяти. Это будет означать, что объект, сконструированный во второй раз, не будет отличаться от первого, в отличие от кеширования объекта типа Random. E
- Взаимодействие с объектом не меняет его состояния. Это будет означать, что кэширование объекта будет безопасным и не изменит поведение последующих вызовов. Это, например, исключило бы изменение словаря любым способом.
Причина этого заключается в том, что компилятор должен быть в состоянии гарантировать, что объект, который он построил в первый раз, будет в равной степени пригоден для использования в следующий раз без необходимости его воссоздания.
Теперь, то, что в C # и .NET нет механизмов для предоставления этих гарантий, вероятно, не является причиной того, почему поддержка такого рода оптимизации не осуществляется компилятором, но они должны быть реализованы в первую очередь. Также могут быть и другие гарантии, которые должны быть у компилятора, прежде чем он сможет это сделать, о которых я не знаю.
Изменение, предложенное Джоном Скитом, в основном означает, что Я знаю, что эти две гарантии верны для моего кода , и, таким образом, вы сами контролируете ситуацию.