Если вы имеете в виду объект (new Foo(i);
), то я понимаю, что нет: это никогда не выделяется в стеке;однако, он умрет в нулевом поколении, поэтому будет очень эффективным для сбора.Я не признаю, что знаю каждый темный и сырой угол CLI, но я не знаю ни одного сценария в C # , который привел бы к тому, что управляемый ссылочный тип был бы выделен в стеке (такие вещи, как stackalloc
на самом деле не считается и очень специфичен).Очевидно, что в C ++ у вас есть еще несколько опций, но тогда это не управляемый экземпляр.
Интересно, что в MonoTouch / AOT это может быть собрано немедленно , но это не основнойВиртуальная машина CLI (и для очень специфического сценария).
Что касается переменной , то будет обычно находиться в стеке (и повторно использоваться для каждого циклаитерация) - но это может не быть .Например, если это «блок итератора», то все не удаленные локальные переменные фактически являются полями конечного автомата, созданного компилятором.Чаще всего, если переменная «захвачена» (в анонимный метод или лямбда-выражение, оба из которых образуют замыкания), тогда переменная преобразуется в поле сгенерированного компилятором контекста захвата, и является отдельным для каждой итерации цикла (так как foo
объявлено внутри цикла).Это означает, что каждый из них - отдельный в куче.
Что касается i
(переменная цикла) - если , что захвачено, это становится еще более интересным
- в C # 1.2 захватов не существовало, но по спецификации переменная цикла равна технически на одну итерацию
- в C # от 2.0 до 4.0, циклпеременная является общей (вызывая печально известный общий вопрос захвата / foreach)
- в C # 5.0 и выше, переменная цикла снова является повторной для каждой итерации
это имеет значение только тогда, когда переменнаязахватывается, но меняет семантику точно как это проявляется в контексте захвата