вопрос эффективности; два идентичных, и в режиме выпуска будет сведено к одному и тому же. В любом случае, string
является ссылочным типом, поэтому сам string
всегда находится в куче. Единственной вещью в стеке будет ссылка на string
- несколько байтов (независимо от длины строки).
"все ли локальные переменные идут в стек": нет; Есть два исключения:
- захваченные переменные (анонимные методы / лямбды)
- блоков итераторов (
yield return
и т. Д.)
В обоих случаях существует класс, сгенерированный компилятором:
int i = 1;
Action action = delegate {i++;};
action();
Console.WriteLine(i);
похож на:
class Foo {
public int i; // yes, a public field
public void SomeMethod() {i++;}
}
...
Foo foo = new Foo();
foo.i = 1;
Action action = foo.SomeMethod;
action();
Console.WriteLine(foo.i);
Следовательно, i
находится на объекте, следовательно, в куче.
Блоки итераторов работают аналогичным образом, но с конечным автоматом.