C# уничтожает переменные для освобождения памяти

Учитывая, что я зацикливаю выполнение функции Foo несколько раз:

int Foo(int a)
{
int b = 5;
return a * b;
}

Я считаю, что переменная "b" инициализируется много раз (столько раз, сколько я инициализирую функцию Foo). Предполагая, что я не хочу перемещать «b» за пределы функции Foo, нужно ли мне освобождать память, требуемую последующими инициализациями «b», или это делается автоматически?


person Tooa1    schedule 09.02.2017    source источник
comment
b создается в стеке. как только вы вернетесь, он исчезнет.   -  person Matthew Whited    schedule 09.02.2017
comment
Если вы считаете, что вам нужно управлять такими переменными, я предлагаю вам прочитать Значение и ссылочные типы и понимание разницы между кучей и стеком   -  person Steve    schedule 09.02.2017
comment
@ Дэн, я бы предпочел, чтобы в моей команде был кодер, который понимает влияние своего кода на память, чем тот, кому все равно.   -  person hoodaticus    schedule 10.02.2017
comment
В этом примере он создается в стеке.   -  person Matthew Whited    schedule 10.02.2017


Ответы (1)


Это целые числа, и их можно хранить в стеке, но в данном случае это маловероятно. Памятью стека не нужно управлять, как только переменная выходит за пределы области видимости, она извлекается из стека, а память освобождается. Также вам редко приходится беспокоиться о ручном управлении памятью в .net, когда вы используете управляемые объекты (правильно).

Чтобы узнать больше о том, действительно ли эти значения хранятся в стеке или нет, см. этот ответ Марка Гравелла. Кроме того, как указано в этом ответе, Эрик Липперт, хорошо написанная статья на эту тему (начиная с 2009 года, но мало что изменилось).

из ответа Марка Гравелла

Иногда они есть, но не как:

  • поля в классе
  • захваченные переменные
  • переменные в блоке итератора
person Igor    schedule 09.02.2017
comment
Типы значений не обязательно помещаются в стек. Они хранятся везде, где хранятся данные для этой переменной, которые могут быть в любом количестве местоположений, только одно из которых — стек. - person Servy; 09.02.2017
comment
@Servy - верно, но в довольно простом примере выше это, вероятно, будет место, где они будут. - person Igor; 09.02.2017
comment
@Igor Вполне вероятно, что его здесь не будет в стеке. Но даже если бы это было правдой, ответ все равно неверен и вводит в заблуждение. - person Servy; 09.02.2017
comment
В этом простом примере я ожидаю, что b будет заменена константой 5 и встроена Foo. - person Lee; 09.02.2017
comment
@Lee - согласился, предполагая, что компиляция была выполнена с включенной оптимизацией. - person Igor; 09.02.2017
comment
@Servy: я совсем запутался с вашим комментарием. У меня сложилось впечатление, что типы значений хранятся в стеке. Итак, где могут храниться типы tvalue, кроме стека? - person Akash KC; 09.02.2017
comment
@LolCoder아카쉬 Они хранятся везде, где хранится значение переменной, как я уже сказал. Некоторые переменные хранятся в стеке, некоторые будут полностью оптимизированы (как, вероятно, имеет место здесь, как упоминает Ли), некоторые будут полностью храниться в регистрах, закрытых локальных переменных, в блоках итераторов, асинхронных методах и т. д. все поля класса, все явные поля класса будут там, где экземпляры этих объектов (что является кучей) статические переменные имеют свой собственный раздел, куда они идут, поля больших объектов будут в куче больших объектов, и Т. Д. - person Servy; 09.02.2017
comment
@LolCoder아카쉬: Вы верите, что все целые числа в int[] находятся в стеке? Верите ли вы, что в стеке находятся упакованные целые числа? Идея о том, что типы значений хранятся в стеке, явно ложна, и я искренне не понимаю, почему так много людей в это верят. Вещи, необходимые для жизненного цикла активации метода, хранятся в стеке; стек — это временный пул хранения. Это не имеет ничего общего с тем, является ли значение int или ссылкой на объект. - person Eric Lippert; 10.02.2017