Определенный ответ должен прийти от команды разработчиков компилятора. Но позвольте мне сделать удар здесь ...
Если ваш вопрос, почему компилятор не включит это:
string s = "";
for( int i = 0; i < 100; i ++ )
s = string.Concat( s, i.ToString() );
в это:
StringBuilder sb = new StringBuilder();
for( int i = 0; i < 100; i++ )
sb.Append( i.ToString() );
string s = sb.ToString();
Наиболее вероятный ответ: Это не оптимизация . Это переписывание кода, который вводит новые конструкции, основанные на знаниях и намерениях, которые имеет разработчик, а не компилятор.
Для этого типа изменений потребуется, чтобы компилятор знал больше о BCL, чем это необходимо. Что если завтра станет доступным более оптимальный сервис сборки строк? Должен ли компилятор использовать это?
Что если бы ваши условия цикла были более сложными , должен ли компилятор попытаться выполнить некоторый статический анализ, чтобы решить, будет ли результат такого перезаписи все еще функционально эквивалентным? Во многих отношениях это похоже на решение проблемы остановки .
Наконец, я не уверен, что во всех случаях это приведет к более быстрому выполнению кода. Существует инстанция для StringBuilder
и изменения размера его внутреннего буфера при добавлении текста. Фактически, стоимость добавления сильно зависит от размера конкатенируемой строки, от того, сколько она существует, как выглядит нагрузка на память. Это вещи, которые компилятор не может предсказать заранее.
Ваша работа как разработчика состоит в том, чтобы писать хорошо работающий код. Компилятор может помочь, только сделав определенные безопасные , сохраняющие инварианты оптимизации. Не переписывать свой код для вас.