Ответ 1
есть ли конкретная причина для их присутствия в режиме отладки?
Разница между:
- нажмите временное значение в стеке, используйте его, отбросьте и
- сохранить временное значение в определенный слот стека, сделать копию его в стеке, использовать его, отбросить, но исходная копия временного значения остается в слоте стека
Видимый эффект этой разницы заключается в том, что сборщик мусора не может быть столь же агрессивным в отношении очистки значения. В первом сценарии значение может быть собрано сразу после вызова. Во втором сценарии значение берется только после возврата текущего метода (или повторного использования слота).
Создание сборщика мусора менее агрессивным часто помогает в сценариях отладки.
Подразумеваемый вопрос:
Почему разница между С# и VB?
Компиляторы С# и VB были написаны разными людьми, которые делали разные варианты о том, как работают их соответствующие генераторы кода.
UPDATE: Re: ваш комментарий
В компиляторе С# неоптимизированное генерация IL по существу имеет ту же структуру, что и внутреннее представление этой функции. Когда мы видим именованный аргумент:
M(y : Q(), x : R());
где метод, скажем,
void M(int x, int y) { }
мы представляем это внутренне, как если бы вы написали
int ytemp = Q();
int xtemp = R();
M(xtemp, ytemp);
Поскольку мы хотим сохранить левую-правую оценку побочных эффектов Q и R. Это разумное внутреннее представление, и когда мы его кодируем в неоптимизированном режиме, мы просто кодируем код непосредственно из внутреннее представление практически без изменений.
Когда мы запускаем оптимизатор, мы обнаруживаем всевозможные вещи - например, тот факт, что никто не использует эти невидимые локальные переменные ни для чего. Затем мы можем устранить локали из кодегена.
Я очень мало знаю о внутреннем представлении VB; Я не работал с компилятором VB с 1995 года, и я слышал, что за последние пятнадцать лет он мог немного измениться. Я бы предположил, что они делают что-то подобное, но я не знаю деталей того, как они представляют именованные параметры или как их генератор кода работает с ними.
Моя точка зрения заключается в том, что эта разница, насколько мне известно, не иллюстрирует важную семантическую разницу. Скорее, это иллюстрирует, что неоптимизированная сборка просто выплескивает любое внутреннее представление высокого уровня, которое мы создали, которое, как мы знаем, имеет желаемую семантику.