Да, в стеке будет две независимые переменные. Они также будут в двух разных фреймах штабелей - один для main
и один для foo
(при отсутствии вставки). Когда Foo
возвращает значение x
все равно будет 1, а не 5.
В самом деле, аргументы всегда передается по значению по умолчанию в C#, как для ссылочных типов и типов значений. Единственное различие заключается в том, что для ссылочных типов значение аргумента равно Ссылка - не сам объект.
См. Мои article on parameter passing для получения более подробной информации об этом.
Обратите внимание, что фактическое поведение того, что происходит в стеке, это implementation detail: компилятор C# должен убедиться, что программа ведет себя так, как определено в спецификации, но это не указывает на поведение стека или кучи. Таким образом, x
должен иметь значение 1 в конце вашего кода, но действительный компилятор C# может положил и x
, и y
на кучу.
Извините за придирчивость, но приведенный выше код не будет скомпилирован в первом случае: p – Syd
Ты сейчас счастлив? –